Google App Engine Kod w chmurze googap

background image
background image

Tytuł oryginału: Code in the Cloud

Tłumaczenie: Maciej Reszotnik

ISBN: 978-83-246-3565-8

Copyright © 2011 Pragmatic Programmers, LLC.
All rights reserved.

Copyright © 2012 by Helion S.A.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means,
electronic or mechanical, including photocopying, recording or by any information storage retrieval system,
without permission from the Publisher.

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej
publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną,
fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje
naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich
właścicieli.

Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były
kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane
z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie
ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji
zawartych w książce.

Wydawnictwo HELION
ul. Kościuszki 1c, 44-100 GLIWICE
tel. 32 231 22 19, 32 230 98 63
e-mail: helion@helion.pl
WWW: http://helion.pl (księgarnia internetowa, katalog książek)

Drogi Czytelniku!
Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres
http://helion.pl/user/opinie/googap
Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Printed in Poland.

Kup książkę

Poleć książkę

Oceń książkę

Księgarnia internetowa

Lubię to! » Nasza społeczność

background image

Spis treci

Cz I Google App Engine — przygotowania do pracy

Rozdzia 1. Wstp ................................................................................ 11

1.1. Czym jest chmura obliczeniowa? ............................................................... 11

1.2. Systemy programowania w chmurze obliczeniowej ...................................... 17

1.3. Podzikowania ......................................................................................... 20

Rozdzia 2. Pocztek ........................................................................... 21

2.1. Zakadanie konta Google App Engine ...................................................... 21

2.2. Konfiguracja rodowiska programistycznego ............................................... 23

2.3. Uruchamianie programu napisanego w Pythonie na platformie App Engine ... 26

2.4. Monitorowanie stanu wasnej aplikacji ....................................................... 33

Cz II Python i Google App Engine

— programowanie aplikacji

Rozdzia 3. Pierwsza prawdziwa aplikacja w chmurze ................. 39

3.1. Podstawowa aplikacja czatu ...................................................................... 39

3.2. Podstawy HTTP .................................................................................... 43

3.3. Mapowanie czatu na HTTP .................................................................... 47

Rozdzia 4. Zarzdzanie danymi w chmurze ................................... 55

4.1. Czemu nasz czat nie zadziaa? ................................................................. 55

4.2. Utrwalanie danych czatu .......................................................................... 58

Kup książkę

Poleć książkę

background image

6

Google App Engine. Kod w chmurze

Rozdzia 5. Obsuga kont uytkowników w Google App Engine ... 69

5.1. Wprowadzenie do obsugi uytkowników ................................................... 69

5.2. Usuga Users — obsuga uytkowników .................................................... 70

5.3. Integrujemy obsug uytkowników z czatem ............................................... 72

Rozdzia 6. Porzdkowanie kodu — oddzielenie

interfejsu uytkownika od logiki .................................. 75

6.1. Praca z szablonami — podstawy ............................................................... 76

6.2. Budowa rónych widoków przy uyciu szablonów ....................................... 81

6.3. Obsuga wielu pokoi czatu ........................................................................ 86

Rozdzia 7. Poprawianie wygldu interfejsu — szablony i CSS .... 93

7.1. Wprowadzenie do CSS ............................................................................ 94

7.2. Nakadanie stylów CSS na tekst ............................................................... 96

7.3. Ukady stron w CSS .............................................................................. 101

7.4. Budowa interfejsu w oparciu o ukad pywajcy ........................................ 108

7.5. Zaczanie arkusza stylów do aplikacji App Engine ................................. 112

Rozdzia 8. Interakcja ...................................................................... 115

8.1. Podstawy tworzenia interaktywnych usug ................................................ 116

8.2. Wzorzec projektowy MVC ..................................................................... 118

8.3. Niezakócona komunikacja z serwerem ..................................................... 121

Cz III Programowanie na platformie App Engine w Javie

Rozdzia 9. Google App Engine i Java ............................................. 131

9.1. Wprowadzenie do GWT ........................................................................ 132

9.2. Praca z Jav i GWT — pocztki ............................................................ 135

9.3. Zdalne wywoania procedur w GWT ...................................................... 143

9.4. Testowanie i przesyanie aplikacji GWT do chmury ................................. 148

Rozdzia 10. Zarzdzanie danymi po stronie serwera ................. 149

10.1. Trwao danych w Javie ....................................................................... 150

10.2. GWT i przechowywanie trwaych obiektów ........................................... 154

10.3. Pobieranie trwaych obiektów w GWT .................................................. 157

10.4. Klient i serwer — komunikacja ............................................................. 160

Kup książkę

Poleć książkę

background image

Spis treci

7

Rozdzia 11. Konstruowanie interfejsów uytkownika w Javie .... 163

11.1. Czemu GWT? .................................................................................... 163

11.2. Konstruowanie interfejsu uytkownika w GWT ..................................... 165

11.3. Oywianie interfejsu — obsuga zdarze ............................................... 171

11.4. Oywianie UI — uaktualnianie widoku ................................................. 176

11.5. GWT — podsumowanie ...................................................................... 178

Rozdzia 12. Aplikacja Javy po stronie serwera ........................... 181

12.1. Wypenianie luk — obsuga pokoi czatu ................................................ 181

12.2. Projektowanie interakcji: inkrementacja .................................................. 186

12.3. Uaktualnianie klienta ............................................................................ 194

12.4. Warstwa administracji czatu .................................................................. 195

12.5. Uruchamianie i przesyanie aplikacji ...................................................... 196

12.6. Strona serwera — zakoczenie .............................................................. 199

Cz IV Google App Engine — wysza szkoa jazdy

Rozdzia 13. Datastore — wysza szkoa jazdy:

typy waciwoci ......................................................... 203

13.1. Tworzenie usugi systemu plików ........................................................... 204

13.2. Modelowanie systemu plików: pierwsze kroki ......................................... 207

13.3. Typy waciwoci — lista ...................................................................... 224

13.4. Typy waciwoci — podsumowanie ...................................................... 227

Rozdzia 14. Datastore — wysza szkoa jazdy:

zapytania i indeksy ..................................................... 229

14.1. Indeksy i zapytania w Datastore ............................................................ 230

14.2. Elastyczniejsze modele Datastore .......................................................... 235

14.3. Transakcje, klucz i grupy encji .............................................................. 237

14.4. Polityka i modele spójnoci ................................................................... 239

14.5. Pobieranie inkrementalne ...................................................................... 242

Rozdzia 15. Usugi Google App Engine .......................................... 245

15.1. Szybki dostp do danych i usuga Memcache ......................................... 246

15.2. Dostp do danych: usuga pobierania adresów URL .............................. 251

15.3. Komunikacja z czowiekiem: poczta elektroniczna i komunikatory ............ 252

Kup książkę

Poleć książkę

background image

8

Google App Engine. Kod w chmurze

15.4. Wysyanie i odbieranie poczty elektronicznej .......................................... 256

15.5. Usugi — podsumowanie ..................................................................... 259

Rozdzia 16. Serwerowe przetwarzanie w chmurze .................... 261

16.1. Terminarz zada i App Engine cron ..................................................... 262

16.2. Dynamiczne inicjalizowanie zada przy uyciu kolejkowania ................... 266

16.3. Serwerowe przetwarzanie w chmurze — podsumowanie ......................... 272

Rozdzia 17. Bezpieczestwo i usugi App Engine ........................ 275

17.1. Bezpieczestwo .................................................................................... 275

17.2. Podstawowe zabezpieczenia .................................................................. 276

17.3. Bezpieczestwo — stopie zaawansowany ............................................. 283

Rozdzia 18. Administracja aplikacj w chmurze ........................ 291

18.1. Monitorowanie ..................................................................................... 291

18.2. Rzut oka na Datastore .......................................................................... 295

18.3. Logi i debugowanie .............................................................................. 296

18.4. Zarzdzanie wasn aplikacj ................................................................ 297

18.5. Nabywanie zasobów ............................................................................. 299

Rozdzia 19. Podsumowanie ............................................................ 301

19.1. Podstawowe pojcia w chmurze ............................................................. 301

19.2. Idee typowe dla App Engine ................................................................ 302

19.3. Co dalej? ............................................................................................. 304

Skorowidz .......................................................................................... 307

Kup książkę

Poleć książkę

background image

Rozdzia 3. • Pierwsza prawdziwa aplikacja w chmurze

39

Rozdzia 3.

Pierwsza prawdziwa
aplikacja w chmurze

tym rozdziale zbudujemy nasz pierwsz, bardziej zoon aplikacj
w Pythonie — pokój czatu. W trakcie pracy spróbujemy odpowiedzie
na nastpujce pytania:



W jaki sposób aplikacje w chmurze korzystaj z protokou HTTP i jak si
komunikuj?



Jak mona zintegrowa zwyky program napisany w Pythonie z protokoem
HTTP tak, by dziaa w chmurze?



Czym róni si zarzdzanie danymi i zmiennymi w chmurze od tradycyj-
nych technik?

3.1. Podstawowa aplikacja czatu

Jak ju wspomniaem, w tym rozdziale bdziemy pracowa nad usug czatu napi-
san w Pythonie. Sdz, e jest to dobry przykad, choby z uwagi na to, e kady
z nas kiedy korzysta z takiej aplikacji. Cho ten rodzaj usug upowszechni si
dawno temu, posiada wiele cech charakterystycznych dla programu w chmurze.

Przetwarzanie w chmurze jest wyjtkowe i intrygujce dlatego, i w praktyce wszyst-
kie utworzone w niej programy s przeznaczone dla wielu uytkowników. Naprawd
w tym rodowisku nie da si skonstruowa dobrej aplikacji bez wzicia pod uwag
metod zarzdzania danymi dla duej liczby klientów.

W

Kup książkę

Poleć książkę

background image

40

Cz II • Python i Google App Engine — programowanie aplikacji

Prostym, wrcz typowym przykadem takiego programu jest wanie czat. By utwo-
rzy t usug, musimy rozway wszystkie formy interakcji midzy uytkownikami,
a take sposoby przechowywania i odzyskiwania trwaych danych. Musimy te
zaimplementowa wiele kanaów dla rónych dyskusji. Dziki moliwociom App
Engine, budowa podstawowej wersji takiego programu i stopniowe dodawanie
nowych funkcji jest spraw prost.

Zignorujemy na razie kwesti interfejsu uytkownika (zajmiemy si nim w roz-
dziale 7., „Poprawianie wygldu interfejsu: szablony i CSS” — strona 93) i sku-
pimy si na tzw. „zapleczu” naszej aplikacji. Od tej pory skoncentrujemy si na
tworzeniu podstawowej logiki dla naszego programu, któr póniej poczymy
z interfejsem. Nie zrobimy tego wszystkiego w jednym rozdziale. Przejdziemy przez
kolejne etapy kreowania programu, krok po kroku, tak by pod koniec tej ksiki
móg sam napisa omówiony tu kod.

Podstawowa aplikacja czatu nie jest skomplikowana — wystarczy j sobie wyobrazi.
Interfejs uytkownika czatu jest zwykle do prosty — powinien zawiera dwa pola —
jedno, wywietlajce transkrypcj rozmowy i drugie, do wpisywania tekstu. W polu
transkrypcji powinny znale si — uoone w chronologicznej kolejnoci — wszystkie
wiadomoci wysane do czatu, kada oznaczona nazw uytkownika i czasem nadania.
Podstawowy interfejs programu winien wyglda podobnie do szkieletu z rysunku 3.1.

Rysunek 3.1.

Szkic interfejsu uytkownika

Teraz, gdy orientujemy si, jak interfejs powinien wyglda, moemy przej do
fazy planowania jego budowy. Nim jednak zaczniemy si zastanawia, jak zaprojek-
towa nasz aplikacj w chmurze, przeanalizujmy, jak wyglda pisanie klasycznego
programu czatu na zwykym serwerze. Z tego wzgldu zajmiemy si najpierw pro-
gramowaniem w Pythonie szkieletowej aplikacji, która bdzie posiadaa wszystkie
interesujce nas funkcje; na razie nie dodamy nawet jednej linijki kodu typowego
dla App Engine.

Kup książkę

Poleć książkę

background image

Rozdzia 3. • Pierwsza prawdziwa aplikacja w chmurze

41

Czego zatem potrzebujemy? Patrzc na pole rozmów, moemy doj do wniosku, e
kady czat tworzy wirtualn przestrze, któr uytkownicy mog odwiedza i opusz-
cza. Po wejciu na czat kady z nich moe wysa wiadomo. Wszystkie wcze-
niej wysane wiadomoci bd od razu widoczne dla kadej nowo przybyej osoby.
Z powyszej analizy wynika, e powinnimy wzi pod uwag trzy podstawowe
obszary: przestrze wirtualn, uytkowników oraz wiadomoci.

Chcemy, by w naszej przestrzeni uytkownicy mieli dostp do wielu tematów kon-
wersacji, eby mogli sami zdecydowa, z kim chc rozmawia i o czym. Przestrze
wyznaczon dla jednego tematu nazwiemy pokojem. W kadym pokoju moe
doj do trzech wydarze — kto moe do niego wkroczy, kto moe go opuci
i kto moe wysa w nim wiadomo. By ca rzecz troch uproci, powiedzmy,
e zamiast uaktualnia wpis za kadym razem, gdy jaka osoba wyle wiadomo,
kady uytkownik musi sam zada transkrypcji wiadomoci raz na jaki czas.
Przykadow implementacj naszego pokoju moesz zobaczy poniej. Nie ma ona
nic wspólnego z aplikacj chmurow. Programy tworzone w chmurze zachowuj
si w zupenie inny sposób i dlatego musz by inaczej pisane. Dalej w ksice
bdziemy budowa program w App Engine, który bdzie w stanie wykona to samo,
co ten, który zaprezentowano poniej, ale w chmurze danych. Przyjrzyjmy si,
w czym dokadnie tkwi podstawowa rónica.

basechat.py

class ChatRoom(object):
"""Pokój"""

rooms = {}

def __init__(self, name):
self.name = name
self.users = []
self.messages = []
ChatRoom.rooms[name] = self

def addSubscriber(self, subscriber):
self.users.append(subscriber)
subscriber.sendMessage(self.name, 'Uytkownik %s doczy do dyskusji.' %
subscriber.username)

def removeSubscriber(self, subscriber):
if subscriber in self.users:
subscriber.sendMessage(self.name,
"Uytkownik %s opuci pokój." %
subscriber.username)
self.users.remove(subscriber)

def addMessage(self, msg):
self.messages.append(msg)

Kup książkę

Poleć książkę

background image

42

Cz II • Python i Google App Engine — programowanie aplikacji

def printMessages(self, out):
print >>out, "Lista wiadomoci: %s" % self.name
for i in self.messages:
print >>out, i

Aplikacja czatu musi obsugiwa pewn grup uytkowników. Kady uytkownik
ma przypisane imi i jest zalogowany w pewnej grupie pokoi. Uytkownik moe
wej do pokoju, opuci go lub wysa wiadomo. Jeli dana osoba nie wesza do
konkretnego pokoju, nie ma prawa wysa w nim wiadomoci.

basechat.py

class ChatUser(object):
"""Uytkownik biorcy udzia w czacie"""
def __init__(self, username):
self.username = username
self.rooms = {}

def subscribe(self, roomname):
if roomname in ChatRoom.rooms:
room = ChatRoom.rooms[roomname]
self.rooms[roomname] = room
room.addSubscriber(self)
else:
raise ChatError("Nie znaleziono pokoju %s" % roomname)

def sendMessage(self, roomname, text):
if roomname in self.rooms:
room = self.rooms[roomname]
cm = ChatMessage(self, text)
room.addMessage(cm)
else:
raise ChatError("Uytkownik %s nie jest zarejestrowany w pokoju %s" %
(self.username, roomname))

def displayChat(self, roomname, out):
if roomname in self.rooms:
room = self.rooms[roomname]
room.printMessages(out)
else:
raise ChatError("Uytkownik %s nie jest zarejestrowany w pokoju %s" %
(self.username, roomname))

Najprostszym komponentem naszego czatu bdzie wysyanie wiadomoci przez
uytkownika. Pojedyncza wiadomo musi zawiera odwoanie do osoby, która j
zamiecia, oraz informacje o czasie, w którym zostaa wysana.

basechat.py

class ChatMessage(object):
"""Pojedyncza wiadomo wysana przez uytkownika czatu"""
def __init__(self, user, text):
self.sender = user
self.msg = text

Kup książkę

Poleć książkę

background image

Rozdzia 3. • Pierwsza prawdziwa aplikacja w chmurze

43

self.time = datetime.datetime.now()

def __str__(self):
return "Od: %s o godzinie %s: %s" % (self.sender.username,
self.time,
self.msg)

W celu przetestowania naszej aplikacji napiszmy szybko program gówny, tzn.
fragment kodu odpowiedzialny za to, by co robia. Na razie pomimy kwesti
interakcji — zamiast tego sprawdmy, czy nasz program w ogóle dziaa i jak si
prezentuje. Utwórzmy w kodzie kilku uytkowników, przypiszmy ich do odpowied-
nich pokojów i sprawmy, by wysali jakie wiadomoci.

basechat.py

def main():
room = ChatRoom("Main")
markcc = ChatUser("MarkCC")
markcc.subscribe("Main")
prag = ChatUser("Prag")
prag.subscribe("Main")

markcc.sendMessage("Main", "Hej! Jest tu kto?")
prag.sendMessage("Main", "Tak, ja tu jestem.")
markcc.displayChat("Main", sys.stdout)

if __name__ == "__main__":
main()

Po uruchomieniu caoci otrzymujemy nastpujc tre:

Lista wiadomoci: Main
Od: MarkCC o godzinie 2011-08-21 14:09:22.735000: Uytkownik MarkCC doczy do dyskusji.
Od: Prag o godzinie 2011-08-21 14:09:22.735000: Uytkownik Prag doczy do dyskusji.
Od: MarkCC o godzinie 2011-08-21 14:09:22.735000: Hej! Jest tu kto?
Od: Prag o godzinie 2011-08-21 14:09:22.735000: Tak, ja tu jestem.

To nie prezentuje si zbyt spektakularnie. Znaczniki czasowe s stanowczo zbyt
rozwleke, a tekst przydaoby si lepiej sformatowa, by by bardziej czytelny, lecz
przynajmniej udao si nam zapewni wszystkie podstawowe komponenty kadego
czatu (pokoje, rejestracj w usudze oraz wiadomoci).

3.2. Podstawy HTTP

Podejcie, które obralimy do projektowania i implementacji naszego bardzo okro-
jonego czatu, jest cakiem rozsdne, przynajmniej dla tradycyjnych aplikacji. Gdy
jednak projektujesz programy w chmurze, musisz wykona jeden dodatkowy krok.
W zwykych programach tego typu naley rozplanowa logik przetwarzania danych

Kup książkę

Poleć książkę

background image

44

Cz II • Python i Google App Engine — programowanie aplikacji

oraz interfejs uytkownika. Naturalnie, równie przy programowaniu aplikacji
w chmurze musisz wzi te czynniki pod uwag, ale dodatkowo trzeba te dla niej
utworzy protokó.

Kade zaplecze programu chmurowego dziaa na pojedynczym serwerze bd ich
skupisku w jakim centrum danych. Z kolei interfejs uytkownika jest uruchamiany
w przegldarce internetowej. Podstawow funkcj protokou jest zapewnienie komu-
nikacji midzy nimi, przez co program sprawia wraenie, jakby w caoci dziaa na
komputerze klienta.

Wikszo aplikacji dziaajcych w chmurze i praktycznie wszystkie programy App
Engine zbudowano w oparciu o protokó HTTP (ang. Hypertext Transfer Pro-
tocol
). Przekada si to na fakt, i nim zaczniesz pisa wasn aplikacj, musisz
wpierw zaprojektowa protokó „nawarstwiony” na HTTP. W tym kontekcie sowo
„nawarstwianie” oznacza, e Twój protokó powinien by zbudowany tak, by kad
interakcj zachodzc w programie mona byo zapisa w odniesieniu do HTTP.
To wanie stanowi jeden z gównych czynników wyróniajcych programowanie
w chmurze wród innych jego form — aplikacje chmurowe bazuj na interakcji
klient-serwer z wykorzystaniem protokou HTTP. Z tego wzgldu prawidowe
nawarstwianie wasnego programu na HTTP jest kluczem do opracowania
wydajnej i przyjemnej w uyciu aplikacji. Prawd jest, e szczególnie wtedy, jeli nie
jeste przyzwyczajony do pracy z HTTP, protokó moe Ci si wyda troch sier-
miny i nieprzystpny, lecz — jak si póniej przekonasz — mona z jego pomoc
tworzy bogate formy interakcji.

By moe wiesz ju co nieco o tym protokole. Warto jednak powici chwil na
krótkie przypomnienie, gdy opanowanie podstaw jego funkcjonowania bdzie nie-
zbdne przy omawianiu dziaania programów w App Engine. Zatem, nim przej-
dziemy do napisania protokou, powtórzmy elementarne informacje o HTTP.

HTTP jest prostym protokoem da i odpowiedzi typu klient-serwer. Innymi
sowy, to wanie dziki niemu dowolne dwie strony mog si ze sob komunikowa.
Jedn z nich nazywamy klientem, drug — serwerem. Kada z tych stron peni
inne funkcje. W protokole HTTP klient inicjalizuje komunikacj, wysyajc da-
nia na serwer; z kolei serwer przetwarza te dania i wysya z powrotem odpowiedzi
dla klienta. Protokó HTTP zajmuje si opisywaniem sposobu, w jaki klient wysya
dania i otrzymuje odpowiedzi.

eby uproci cay proces, kade danie jest wycentrowane na zasobach. W tym
kontekcie zasobem jest wszystko to, czemu przyznano w sieci nazw. Do kadego
zasobu odnosimy si za pomoc ujednoliconego formatu adresowania zasobów
URL (ang. Universal Resource Locator). Adres URL peni funkcj podobn do
cieki do pliku, lecz mona si w nim odnie do wielu rzeczy — plików, caych

Kup książkę

Poleć książkę

background image

Rozdzia 3. • Pierwsza prawdziwa aplikacja w chmurze

45

programów, ludzi, procesów i do wszystkiego, co tylko sobie wyobrazisz. Kade
zapytanie na serwerze jest w istocie prob o otrzymanie potrzebnych danych lub
o moliwo ich przesania do zasobu.

Co wicej, kade danie HTTP od strony klienta wywouje konkretn metod po
stronie serwera. (Jest to troch mylce, ale wbrew przyjtemu nazewnictwu „metody”
stosowane w tym przypadku nie maj nic wspólnego z „metodami” uywanymi
w programowaniu obiektowym). W HTTP wyróniamy cztery podstawowe metody
(oraz ponad tuzin rozszerze, których jednak nie bd omawia, poniewa nie przy-
dadz si w naszej aplikacji).

GET

Wysya na serwer prob o moliwo pobrania informacji z zasobu i prze-
sanie ich do klienta.

HEAD

Wysya prob o podanie przez serwer informacji o danym zasobie. Dziaa
wic podobnie do metody

GET

, z tym e otrzymana odpowied zawiera je-

dynie metadane. Przykadowo mógby skorzysta z tego dania, by zada
pytanie: „Jak wielki jest ten zasób”, bez potrzeby przesyania go w cao-
ci. Co prawda, niewiele aplikacji uywa metody

HEAD

, lecz z pewnoci jest

czasem przydatna.

PUT

Przechowuje dane w okrelonym zasobie. Dziaanie tej metody polega na
przesaniu informacji na serwer, by zachowa j w zdefiniowanej przestrzeni.
W odpowiedzi serwer wysya informacj zwrotn, czy interesujce dane udao
si zapisa.

POST

Przesya dane do dziaajcego na serwerze programu. dania typu

POST

s troch dziwne. Pozornie rónica midzy metodami

POST

i

PUT

wydaje si

marginalna. Wywodzi si ona z pierwszych lat funkcjonowania Internetu,
kiedy to wiele serwerów sieciowych byo uruchomionych na maych kompute-
rach prywatnych. W owych serwerach wszystkie dania typu

GET

i

PUT

byy

interpretowane jako proby o przesanie lub przechowanie danych. Dlatego
te, aby uruchomi program na serwerze, potrzebna bya oddzielna metoda,
która prosiaby o jego inicjalizacj. Jednak w nowoczesnych systemach zarówno
da

PUT

, jak i

POST

uywa si zamiennie.

Kade danie HTML, czy to wygenerowane przez Twoj przegldark, czy prze-
tworzone przez App Engine, skada si z trzech czci. Oto one.



Linia dania, zoona z metody HTTP, po której wystpuje adres URL
zasobu i, kolejno, specyfikacja wersji protokou. W wikszoci przypadków
Twoja przegldarka wysya dania typu

GET

, w wersji specyfikacji

HTTP/1.1

.



Sekwencje linijek nagówków zawierajcych metadane o daniu (takie
jak specyfikacja zawartoci —

Content-Type

— z której korzystalimy

Kup książkę

Poleć książkę

background image

46

Cz II • Python i Google App Engine — programowanie aplikacji

w podrozdziale 2.3, „Uruchamianie programu napisanego w Pythonie na
platformie App Engine”, na stronie 26). Wikszo da przegldarek
bdzie podawa swoj wersj (w tzw. nagówku uytkownika — ang.
user-agent header) i jaki identyfikator (nagówek From:). Ponadto na
nagówki mog skada si odniesienia do plików cookie, identyfikatory
jzykowe, adresy sieciowe itp. Wewntrz nagówka moe si znale
wszystko, bowiem serwery i tak po prostu ignoruj zawarto tych, których
nie s w stanie rozpozna.



Ciao (ang. body) dokumentu skadajce si z dowolnego potoku danych.

Ciao i nagówki s od siebie odseparowane pust lini — bez jakiejkolwiek treci.
Ogólnie rzecz biorc, ciao da typu

GET

i

HEAD

jest puste. Spójrz na ponisze przy-

kadowe danie

GET

:

GET /rooms/chatter HTTP/1.1
User-Agent: Mozilla/5.001 (windows; U; NT4.0; en-US; rv:1.0) Gecko/25250101 Host:
´markcc-chatroom-one.appspot.com

Po wysaniu dania HTML na serwer odpowiada on podobnie skonstruowan
wiadomoci. Rónica polega na tym, e zamiast linii dania serwer otwiera swoj
odpowied tzw. wierszem stanu. Rozpoczyna si on od kodu stanu i wiadomo-
ci stanu, gdzie zawarte s informacje, czy danie zostao wykonane, a jeli nie, to
z jakiego powodu. Typowy wiersz stanu generowany przez usug w chmurze ma
posta

HTTP/1.1 200 OK

, gdzie fragment

HTTP/1.1

okrela, z jakiego protokou serwer

skorzysta,

200

jest kodem stanu, a sowo

OK

jego wiadomoci.

Kod stanu zawsze skada si z trzech cyfr. Pierwsza z nich ustala ogólny rodzaj
odpowiedzi. I tak:

1

oznacza „odpowied informujc”.

2

oznacza pomylne zakoczenie dania.

3

oznacza przekierowanie — klient otrzymuje wiadomo o pooeniu danego
zasobu w innym miejscu. Proces przekierowania mona by adekwatnie pod-
sumowa zdaniem: „Nie ma tu poszukiwanej przez Ciebie informacji,
ale znajdziesz j pod nastpujcym adresem URL”.

4

wskazuje na bd po stronie klienta (np. kod

404

oznacza, e klient domaga

si dostpu do zasobu nieistniejcego w danym miejscu na serwerze).

5

wskazuje na bd po stronie serwera (np. gdy uruchomiony na nim program
wykona nieprawidow operacj).

Oto przykadowa odpowied serwera na przedstawione powyej danie

GET

:

HTTP/1.1 200 OK
Date: Sat, 26 Jun 2009 21:41:13 GMT
Content-Type: text/html Content-Length: 123

Kup książkę

Poleć książkę

background image

Rozdzia 3. • Pierwsza prawdziwa aplikacja w chmurze

47

<html>
<body>
<p>MarkCC: Hej, jest tu kto?</p>
<p>Prag: Tak, ja tu jestem.</p>
</body>
</html>

Przeanalizujmy wspólnie sekwencj danie-odpowied. Zaómy, e do wysyania
wiadomoci w naszym czacie wykorzystujemy metod

POST

. Wtedy nasze zapytanie

mogoby wyglda nastpujco:

POST /submit HTTP/1.1
User-Agent: Mozilla/5.001 (windows; U; NT4.0; en-US; rv:1.0) Gecko/25250101
Host: markcc-chatroom-one-pl.appspot.com
From: markcc.pol@gmail.com

<ChatMessage>
<User>MarkCC</User>
<Date>June 26, 2009 16:33:12 EDT</Date>
<Body>Hej, jest tam kto?</Body>
</ChatMessage>

Gdyby zakoczyo si powodzeniem, otrzymalibymy nastpujc wiadomo:

HTTP/1.1 303 See other
Date: Sat, 20 Aug 2011 21:41:13 GMT
Location: http://markcc-chatroom-one-pl.appspot.com/

3.3. Mapowanie czatu na HTTP

W celu zmiany naszej napisanej w Pythonie aplikacji, tak aby dziaaa w chmurze
App Engine, musimy wpierw zmapowa podstawowe wykonywane przez ni ope-
racje na dania i odpowiedzi HTTP.

W wersji, nad któr bdziemy pracowa, pominiemy kwesti rejestracji — utwo-
rzymy jedynie pojedynczy pokój i jeli uda si z nim poczy, automatycznie poja-
wimy si w nim. W tej chwili nie musimy si przejmowa uytkownikami nowymi
i opuszczajcymi pokój.

Wyobra sobie, e korzystasz z pokoju. Co chciaby w nim robi?

Po pierwsze, przydaoby si zobaczy nowe wiadomoci w naszym pokoju. Prze-
kadajc to na zasad dziaania protokou HTTP, pokój naszego czatu jest zasobem,
którego zawarto chcesz zobaczy. Oczywicie, do tego celu wietnie si nada
metoda

GET

, która pomoe pobra zawarto czatu i j wywietli.

Chcemy te mie moliwo wysyania wiadomoci, wobec czego bdziemy potrze-
bowa sposobu na zakomunikowanie naszemu programowi przez przegldark,

Kup książkę

Poleć książkę

background image

48

Cz II • Python i Google App Engine — programowanie aplikacji

HTTP — kody stanu

W standardzie HTTP zdefiniowano wiele kodów stanów, które wykorzystuje
si w przesyanych przez serwer wiadomociach zwrotnych. Oto kilka naj-
czciej spotykanych.

200 OK

Pomylnie odebrano i przetworzono danie. Ciao wiadomoci zwrot-
nej na ogó zawiera dane dane.

301 Moved permanently

(zasób przeniesiono na stae)

dany zasób nie znajduje si ju pod okrelonym adresem URL i kada
nowa proba o jego udostpnienie powinna by przesana pod nowy
adres.

303 See other

(znajdziesz w innym miejscu)

dane zasoby znajduj si w innym miejscu i mog by odzyskane za
pomoc metody

GET

, wysanej pod inny adres URL. Adres ten winien

by zawarty w nagówku pooenia wiadomoci zwrotnej. Rzeczony
kod pojawia si czsto w odpowiedzi na dania typu

PUT

— po tym,

jak zapytanie to zostao pomylnie przetworzone, serwer informuje
klienta, gdzie moe szuka potrzebnych zasobów bezporednio.

401 Unauthorized

(brak uwierzytelnienia)

Samo danie byo poprawne, lecz nie zawierao danych uwierzytel-
niajcych, które s wymagane w celu otrzymania dostpu do zasobu.
Uytkownik moe wykorzysta inne zapytania, by zdoby niezbdne
informacje i ponowi to danie.

403 Forbidden

(dostp zabroniony)

danie byo sformuowane poprawnie, lecz dostp do zasobów zosta
zabroniony. Kod ten dziaa tak samo jak kod

401

, z t rónic, e albo

nawet po uwierzytelnieniu dany uytkownik nie ma dostpu do zasobów,
albo dostp dla wszystkich uwierzytelnionych uytkowników jest
wzbroniony.

404 Not found

(nie odnaleziono)

danego zasobu nie odnaleziono w okrelonej lokacji sieciowej.

500 Internal Server Error

(wewntrzny bd serwera)

Kady bd serwera, który pojawi si w trakcie przetwarzania zapyta-
nia, zwróci kod stanu

500

. W kontekcie App Engine, jeli Twój wasny

kod zawiesi si lub wykona nieprawidow operacj, przegldarka po
stronie klienta otrzyma wanie t informacj.

501 Not implemented

(brak wsparcia)

Zapytanie prosi o wykonanie operacji nieobsugiwanej przez serwer.
Komunikat tego typu otrzymasz, gdy popenisz bd np. w nazwie
adresu URL dania

POST

.

Kup książkę

Poleć książkę

background image

Rozdzia 3. • Pierwsza prawdziwa aplikacja w chmurze

49

eby zamieci wpisan przez nas w aktywnym polu wiadomo. I znów nasz pokój
czatu jest zasobem, ale w tym wypadku masz w nim umieci tre. Wobec tego,
do wykonania zadania musimy uy metody

PUT

lub

POST

. Decyzja, z której skorzy-

stamy, zaley od tego, czy chcemy zastpi zawarto zasobu, czy po prostu wysa
tam komunikat. Naturalnie wysyanie wiadomoci mieci si bardziej w tej drugiej
definicji. Nie chcemy zastpi wiadomoci w naszym pokoju, chcemy natomiast
przekaza do naszej aplikacji informacj, e ma wywietli now wiadomo. Dlatego
te uyjemy dania

POST

.

W ten sposób zdefiniowalimy struktur, na podstawie której zbudujemy program.
Naszym jedynym zasobem bdzie pokój czatu. Uytkownicy bd mogli pobra
zawarto tego zasobu za pomoc zapytania

GET

i wtedy zapoznaj si z jego zawar-

toci. Potrzebujemy innego zasobu — aktywnego procesu, do którego osoby bd
wysya dania

POST

, by umieci wiadomoci na czacie.

Teraz musimy rozway implementacj elementarnego interfejsu uytkownika.
W jaki sposób uytkownik bdzie dodawa dane do naszej aplikacji? Jasne jest, e
trzeba bdzie zapewni tak moliwo. Najprociej utworzy na stronie formu-
larz, który zostanie wypeniony zawartoci po kadym logowaniu uytkownika do
pokoju. Strona czatu ma si wic skada z tytuu na górze, obszaru rozmów, w któ-
rym wywietlane bd kolejne wiadomoci, oraz pola wpisów z przypisan nazw
uytkownika, gdzie kada osoba bdzie moga doda swoj tre.

Aby uruchomi powysz aplikacj w App Engine, bdziemy musieli utworzy
(na podstawie klasy

RequestHandler

) dwa handlery da — jeden, który zaim-

plementuje metod

GET

do odzyskiwania zawartoci pokoju z serwera, oraz drugi,

wykorzystujcy metod

POST

, w celu dodania treci do czatu.

Strona gówna naszego czatu bdzie prezentowa si podobnie do tej z rozdziau 2.,
„Pocztek”. Podstawowa rónica polega na tym, e dodamy do niej dynamiczne
elementy — wszystko to, co moe si przyda do wywietlania i wysyania wiado-
moci. Dlatego te nie moemy po prostu ponownie wykorzysta uprzednio zapre-
zentowanego kodu HTML; trzeba bdzie troch do niego dopisa. W pierwszej
wersji czatu zadeklarujemy zmienn globaln, która przyjmie list wysanych wiado-
moci. Po zaadowaniu strony wywietlimy je wszystkie.

chattwo/chattwo.py

class ChatMessage(object):
def __init__(self, user, msg):
self.user = user
self.message = msg
self.time = datetime.datetime.now()

def __str__(self):
return "%s (%s): %s" % (self.user, self.time, self.message)

Kup książkę

Poleć książkę

background image

50

Cz II • Python i Google App Engine — programowanie aplikacji

Messages = []

class ChatRoomPage(webapp.RequestHandler):
def get(self):
self.response.headers["Content-Type"] = "text/html charset=UTF-8"
self.response.out.write("""
<html>
<head>
<title>Witaj w pokoju czatu MarkCC w App Engine</title>
</head>
<body>
<h1>Witaj w pokoju czatu MarkCC w App Engine</h1>
<p>(Dokadny czas Twojego logowania to: %s)</p>
"""
% (datetime.datetime.now()))
# Wysyanie wiadomoci na serwer.
global Messages
for msg in Messages:
self.response.out.write("<p>%s</p>" % msg)
self.response.out.write("""
<form action="" method="post">
<div><b>Twój nick:</b>
<textarea name="name" rows="1" cols="20"></textarea></div>
<p><b>Twoja wiadomo</b></p>
<div><textarea name="message" rows="5" cols="60"></textarea></div>
<div><input type="submit" value="Wylij wiadomo"></input></div>
</form>
</body>
</html>
"""
)

Obsuga dania

POST

jest dla nas czym nowym, lecz dziki frameworkowi webapp

czynno ta jest prosta. W handlerze dania

GET

przesaniamy metod

get

klasy

bazowej

RequestHandler

. Analogicznie, dla dania

POST

nadpisujemy metod

post

tej klasy. Klasa bazowa

RequestHandler

zapewnia to, e gdy metoda

post

zostaje

wywoana, pola utworzonego obiektu s wypeniane wszelkimi potrzebnymi danymi.
Jeli chcemy uzyska informacje z pól formularza, które wysay danie

POST

,

wystarczy, e wywoamy metod

get

, korzystajc z etykiety wypenionej w formu-

larzu. W naszym kodzie nazw uytkownika i tre wiadomoci otrzymamy bez-
porednio z dania

POST

. Uyjemy ich do utworzenia obiektu wiadomoci, który

dodamy do globalnej listy wszystkich wypowiedzi uytkowników.

chattwo/chattwo.py

def post(self):
chatter = self.request.get("name")
msg = self.request.get("message")
global Messages
Messages.append(ChatMessage(chatter.encode( "utf-8" ), msg.encode( "utf-8" )))
# Po tym, jak dodalimy nasz wiadomo do czatu, przekierujmy nasz aplikacj na jej
# wasny adres, aby j odwiey, co spowoduje wywietlenie nowej wiadomoci.
self.redirect('/')

Kup książkę

Poleć książkę

background image

Rozdzia 3. • Pierwsza prawdziwa aplikacja w chmurze

51

Teraz wystarczy wszystko zoy w jeden program. Zrobimy to w dwóch etapach.
Na pocztek napiszemy fragment kodu, który spowoduje powstanie obiektu apli-
kacji i przerzuci wszelkie dania do naszych handlerów. Nastpnie utworzymy
plik app.yaml. Dopiero wtedy bdziemy mogli sprawdzi, czy nasz program dziaa.

Plik app.yaml ma prawie tak sam tre jak poprzednio. Zmieniem, co prawda,
nazw pliku programu, wobec czego musimy równie zmieni odpowiedni wpis
w konkretnym polu.

chattwo/app.yaml

application: markcc-chatroom-one-pl
version: 1
runtime: python
api_version: 1

handlers:
- url:
/.*
script: chattwo.py

A oto fragment kodu Pythona specyficzny dla frameworka webapp.

chattwo/chattwo.py

chatapp = webapp.WSGIApplication([('/', ChatRoomPage)])

def main():
run_wsgi_app(chatapp)

if __name__ == "__main__":
main()

Jeli go uruchomimy (posikujc si aplikacj dev_appserver.py, tak jak w poprzed-
nim rozdziale), naszym oczom ukae si prosty, acz funkcjonalny czat. Pora go
wypróbowa. Dziaa wymienicie! Teraz moemy go swobodnie przesa na serwery
App Engine. Tak jak wczeniej, robimy to za pomoc polecenia

appcfg.py update

.

Na rysunku 3.2 wida efekt pracy naszej aplikacji. Prezentuje si ona dokadnie tak,
jak na serwerze lokalnym. Wysaem z jej pomoc dwie wiadomoci, uywajc dwóch
rónych nazw uytkownika, i otrzymaem przyzwoicie wygldajc konwersacj.

Musiaem jednak na chwil odej od komputera, by wykpa mego synka i uoy
go do snu. Gdy wróciem, wysaem kolejn wiadomo. Efekt moesz podziwia
na rysunku 3.3.

Wszystkie dawne wiadomoci znikny! Pole treci nie zawiera adnych wiado-
moci poza t, któr wanie wysaem. Nie napisalimy przecie w naszym skrypcie
nic, co mogoby spowodowa wykasowanie wiadomoci. Nie moe robi nic poza
dodawaniem nowych. Co si wic stao z tymi zaginionymi? Gdzie si podziay?

Kup książkę

Poleć książkę

background image

52

Cz II • Python i Google App Engine — programowanie aplikacji

Rysunek 3.2.

Aplikacja czatu w akcji

Rysunek 3.3.

Aplikacja czatu po duszej przerwie

Odpowied brzmi — nigdzie. Dostalimy pstryczka w nos, gdy nie wzilimy pod
uwag podstawowej rónicy midzy aplikacj pisan w chmurze a tradycyjn. Otó,
piszc program bezporednio dla serwera, jeste wiadom, e kade danie zosta-
nie przez niego obsuone. Zwykle, korzystajc z interpretera Pythona, wysyamy
na serwer danie do przetworzenia i mamy pewno, e bdzie aktywny przez

Kup książkę

Poleć książkę

background image

Rozdzia 3. • Pierwsza prawdziwa aplikacja w chmurze

53

cay czas. Gdy jednak wysyasz danie na serwer w chmurze, jest ono przenoszone
na dowolny serwer w dowolnym centrum danych. Nie ma adnej gwarancji, e
dwa dania zostan przesane na ten sam serwer, czy nawet na serwer znajdujcy
si na tym samym kontynencie.

A jeli nawet jakim cudem tak si stanie, znów nie masz adnych gwarancji, e
serwer bdzie przetwarza kod Pythona przez cay ten czas. We frameworkach bazu-
jcych na chmurze, takich jak webapp, wszelkie handlery da s niezalene od
stanu, co oznacza, i raczej nie moesz liczy na to, e Twoje zmienne zostan
zapamitane. Musisz wic budowa swoje aplikacje tak, jakby kade nowe danie
byo uruchamiane przez nowy interpreter Pythona.

Naprawd mielimy wielkie szczcie, e nasza aplikacja w ogóle zadziaaa w chmu-
rze. Gdy uruchomimy j lokalnie, program dev_appserver korzysta wycznie z jed-
nego interpretera, dlatego te aplikacja dziaa bez zarzutu. Po zaadowaniu na
serwer App Engine jest program uruchamiany w chmurze. Po przesaniu pierw-
szego dania losowy serwer uruchomi interpreter Pythona, by je wykona. Gdy
wysaem pierwsz napisan wiadomo, byo to równoznaczne z otrzymaniem jej
w formie kolejnego dania przez t platform. Gówny komputer App Engine roz-
pozna, e na jednym z serwerów jest obecnie wczony interpreter Pythona, który
obsuy wanie danie tej samej aplikacji i w tej chwili nie jest zajty — z tego
powodu przesa je do niego.

Niestety, gdy odszedem od monitora na kwadrans, w pewnym momencie jedna
z usug App Engine wykrya, e interpreter Pythona, który uruchomi mój czat, by
za dugo w stanie oczekiwania, wic go wyczy. Dlatego te kolejna wysana przez
mnie wiadomo, miast zosta przetworzona przez starsz instancj, uruchomia
now.

Problem ten trzeba obej. Z tego wzgldu w przyszoci, budujc nasze aplikacje,
bdziemy musieli wyrazi jasno, w jaki sposób chcemy zarzdza danymi wspó-
dzielonymi przez róne dania. Nie moemy polega na zmiennych w moduach
i klasach. Musimy wyranie okreli, kiedy chcemy, by nasze informacje zostay
zapisane i kiedy mamy je odczyta.

Pynie z tego prosta lekcja — zwyczajne metody przechowywania danych nie maj
w chmurze zastosowania. Na szczcie, webapp oferuje cakiem niez, trwa usug
znan jako Datastore. Porozmawiamy o niej w nastpnym rozdziale.

Kup książkę

Poleć książkę

background image

54

Cz II • Python i Google App Engine — programowanie aplikacji

róda

Dokumentacja RFC 2616: Hypertext Transfer Protocol
— HTTP/1.1…

http://www.w3.org/Protocols/rfc2616/rfc2616.html

Opracowane przez konsorcjum W3C informacje o standardzie protokou
HTTP.

Artyku Wikipedii powicony HTTP

http://pl.wikipedia.org/wiki/Hypertext_Transfer_Protocol

Zwizy, dokadny opis protokou HTTP.

Django

http://www.djangoproject.com

Django jest powszechnie stosowan platform dewelopersk — jednym
z frameworków Google App Engine. Niektóre mechanizmy App Engine
zapoyczyy z niej wiele rozwiza.

Django Nonrel

http://www.allbuttonspressed.com/projects/django-nonrel

Django Norrel to wariant frameworka Django, który uatwia prac z plat-
formami nieopartymi o relacyjne bazy danych.

Kup książkę

Poleć książkę

background image

Skorowidz

@SuppressWarnings, 160
200 OK, 48
301 Moved permanently, 48
303 See other, 48
401 Unauthorized, 48
403 Forbidden, 48
404 Not found, 48
500 Internal Server Error, 48

A

Admin Logs, 297, 299
adres URL dania, 269
AIM, 252
AJAX, 115, 122
Amazon EC2, 17
Amazon S3, 18
app.css, 112
app.yaml, 28, 31, 51, 89, 112, 254, 278, 287

application, 29
runtime, 29
version, 29

appcfg.py, 26

update, 51

app-engine-patch, 305
appengine-web.xml, 254, 255
Application Setting, 297
Application Title, 298
ArrayList, 153
asynchroniczne przesyanie, 144
Asynchronous JavaScript and XML (AJAX), 115
ataki hakerów, 284

bezporednie, 284, 285
cross-site scripting (XSS), 284, 286
DoS, 285, 287
podsuchujce, 284

Atomic, Consistent, Isolated, Durable state

(ACID), 240

auto_now_add, 61

B

Backend usage, 294
Basically Available, Soft State, with Eventual

consistency (BASE), 240

biblioteka, 245
Bigtable, 230
Billing History, 299
Billing Settings, 299
binary large object, 224
BlobProper, 224
Blogger, 12
BooleanProperty, 224
button, 165
ByteStringProperty, 224

C

callback, 122
Cascading Style Sheets (CSS), 94
CategoryProperty, 226
ChatMessage, 60, 63, 73
ChatRoomCounted, 88
ChatRoomCountViewPage, 64
ChatRoomPage, 71, 80
chmura, 57

Kup książkę

Poleć książkę

background image

308

Google App Engine. Kod w chmurze

chmura obliczeniowa, 11
ciao, 46

wiadomoci, 270

Classless Inter-Domain Routing (CIDR), 288
cloud computing, 11
code augmentation, 153
Common Gateway Interface (CGI), 26
Configured Services, 298
container widgets, 165
continuation passing style (CPS), 172
Cookie Expiration, 298
CPU Time, 294
cron, 263
cron.xml, 263, 264
CSS, 94

border, 110
clear, 110
color, 110
float, 110
padding, 110
background-color, 96
border, 105
dashed, 105
dotted, 105
double, 105
float, 103
grooved, 105
inset, 105
margin, 105
outset, 105
padding, 105
position, 106
ridge, 105
sans-serif, 97
solid, 105
text-decoration, 96

D

dashboard, 34, 198, 291
Datastore, 230, 295, 304

admin, 280
choices, 280
GetUserRole, 280
Index Error, 280
privileged, 280
role, 280
StringPropert, 280

StringProperty, 280
UserRole, 280
Users, 280

Datastore Indexes, 295
Datastore Statistics, 295
Datastore Viewer, 295
Datastore wysokiej replikacji, 304
DateProperty, 224
DateTimeProperty, 224
datownik, 60
db.Model, 60, 61
db.StringProperty, 61
db.TextProperty, 61
deltatime, 85
Denial of Service (DoS), 285
Deploy to App Engine, 197
Details, 294
dev_appserver, 53
dev_appserver.py, 26, 29, 30, 51
DialogBox, 142
Disable Application, 298
Disable or Delete Application, 298
Disable/Re-Enable Datastore Writes, 298
Django, 70, 304
djangoappengine, 305
Document Object Model (DOM), 115
Domain Setup, 298
dos.yaml, 288
drop down, 165
dziedziczenie szablonów, 83

E

Eclipse, 132, 150, 198
ekran logów, 36
Elastic Computing Cloud, 17
elastyczno, 95
email(), 71
EmailProperty, 226
engine, 26
Estimated Time of Arival (ETA), 270
extends, 84
eXtensible Messaging and Presence Protocol

(XMPP), 252

F

FilesystemResourceHandler.get, 251
filtr ucieczki using | escape, 79
filtry relacyjne, 232

Kup książkę

Poleć książkę

background image

Skorowidz

309

filtry równoci, 232
flexibility, 95
FloatProperty, 225

G

Gadu-Gadu, 252
GeoPtProperty, 226
get_current_user(), 71
Go, 304
Google App Engine, 11, 58, 69

Application Identifier, 24
Application Title, 25
Authentication Options, 25
Billing Status, 293
Check Availability, 24
Create an Application, 23
Instances, 293
konfiguracja rodowiska programistycznego, 23
panel sterowania, 26, 33, 35
Resources, 34, 294
Settings, 294
Terms of Service, 25
uruchamianie programu, 26
zakadanie konta, 21

Google Checkout, 299
Google MapReduce, 305
Google Storage, 304
Google Talk, 252
Google Web Toolkit (GWT), 131
GQL, 59, 62
Graphic User Interface (GUI), 119
grupy encji, 237
GWT, 178

H

handler, 32
handler da cron, 264
harmonogram cron, 266
HashSet, 153
hashtable, 245
header(), 270
High Replication Data, 294
High-replication Datastore, 304
HTML, 77
httplib, 251
Hypertext Transfer Protocol (HTTP), 44

I

IBM Computing on Demand, 19
identity type, 152
IdentityType.APPLICATION, 152
IMProperty, 226
InboundEmailMessage, 258, 259
InboundMailHandler, 258
Incoming Bandwidth, Outgoing Bandwidth, 294
indeksy równoci, 232
index.yaml, 229
IntegerProperty, 225
Integrated Development Environment (IDE), 23
IsSerializable, 188

J

Java ChatMessage, 150
Java Data Objects (JDO), 150
Java Virtual Machine (JVM), 132
java.net.URLConnection, 251
JavaScript, 115
javax.mail, 257
JDOQL, 157

order by, 159
parameters, 159
select, 158
where, 159

jzyki dynamiczne, 133
jzyki statyczne, 133

K

kaskadowe arkusze stylów, 94
Key, 225
klasa

ChatMessage, 60
db.DateTimeProperty, 61
db.Model, 60, 61
db.StringProperty, 61

klient, 44
klucz, 44
kody stanu HTTP, 48

200 OK, 48
301 Moved permanently, 48
303 See other, 48
401 Unauthorized, 48
403 Forbidden, 48

Kup książkę

Poleć książkę

background image

310

Google App Engine. Kod w chmurze

kody stanu HTTP

404 Not found, 48
500 Internal Server Error, 48
501 Not implemented, 48

komponenty, 165

szkieletowe, 165

kontrolki, 165
kontynuacyjny styl programowania, 172

L

LinkedList, 153
LinkProperty, 226
ListProperty, 225
listy rozwijane, 165
Logs with minimum severity, 36

M

master.html, 84, 90
master-slave, 304
Memcache, 246
message, 61
metadanych, 134
metoda

close(), 155
db.create_rpc, 241
email(), 71
equals(), 153
FilesystemResourceHandler.get, 251
GET, 45
get, 50, 64
getChats, 195
getObjectById, 157
HEAD, 45
header(), 270
initializeChats, 195
IsDir, 217
nickname(), 70
o.put(), 155
param(), 269
payload(), 270
POST, 45
post, 50
put(), 86
PUT, 45
SetAttribute, 216
user_id(), 71
xmpp.get_resence, 253

PersistenceManager.makePersistent(o), 155
put(), 62
url(), 269
Microsoft Azure, 19
moc obliczeniowa, 22
model ekspando, 60
model expando, 236
modele spójnoci, 239
Model-View-Controller (MVC), 115
monitorowanie, 291
MSN, 252
MSN Chat, 252
MVC, 115

Kontroler, 119
Model, 119
Widok, 119

N

name, 272
nazwa zadania, 269
Network Time Protocol (NTP), 191
nickname(), 70

O

obiekt RPC, 241
obiekt uytkownika, 70
obiekty modelu dokumentu, 116
oczekiwany czas wykonania zadania, 270
odseparowanie zagadnie, 95
ograniczenia opywania, 103

P

pagecontent, 86
param(), 269
parametry CGI, 269
parametry nagówków, 270
payload(), 270
PChatMessage, 235, 295
PChatRoom, 295
Permissions, 297, 298
persistence key, 183
PersistenceManager, 154
PersistenceManagerFactory, 154
PhoneNumberProperty, 226
platformy chmurowe, 58
podelementy XML, 263

Kup książkę

Poleć książkę

background image

Skorowidz

311

<description>, 263
<schedule>, 263
<url>, 263

pola tekstowe, 165
polimodel, 235, 236
ponowne uycie, 95
POST, 50
PostalAddressProperty, 226
postMessage, 297
programowanie funkcyjne, 57
protokó, 44
przepenienie bufora, 279
przyciski, 165

opcji, 165

put(), 62
Python, 27

Q

queue.xml, 272

R

radio button, 165
rate, 272
RatingProperty, 226
read_policy, 241
Recepients Emailed, 294
Re-enable application now, 298
ReferenceProperty, 225
remote procedure call (RPC), 135, 143
Representative State Transfer (REST), 205
RequestHandler, 32, 50, 258
required=true, 60
ResourceAttribute, 234
reusablity, 95
równo obiektów, 232
run_wsgi_app, 33

S

samoczynne wykrywanie inicjalizacji, 195
SDK Pythona, 25
Secure Socket Layer (SSL), 284
security-level, 234
selektor, 96
SelfReferenceProperty, 225
Separation of Concerns (SoC), 95
serwer, 44

serwlet, 265
Simple Storage Service, 18
Software Development Kit (SDK), 21
SQL Injection, 286
SSL, 305
Stack, 153
Stored Data, 294
StringProperty, 225
system szablonów, 31
szablony, 76
szeregowanie, 232

T

tablicy rozdzielcza, 291
task queues, 266
template processors, 31
template.renderer, 80
templates, 76
text box, 165
TextProperty, 225
time, 61
TimeProperty, 224
timestamp, 60, 61
total-storage-limit, 272
transakcje, 155
TreeSet, 153
trwaa przestrze przechowywania, 56
typ danych

date, 60
number, 60
reference, 60
string, 60

typ tosamoci, 152
typ dania, 269
typy elementarne, 224

U

Universal Resource Locator (URL), 44
urllib, 251
urllib2, 251
user, 60
user_id(), 71
user-agent header, 46
usuga, 70, 245

Users, 70

usuwanie typów, 159

Kup książkę

Poleć książkę

background image

312

Google App Engine. Kod w chmurze

V

Vector, 153
Versions, 297, 299
VerticalPanel, 142

W

warstwa administracyjna, 276
web.xml, 256, 266
webapp, 27, 31, 51, 53, 69, 76
WebDAV, 204
webhooks, 253
widgety, 165
wiersz stanu, 46
WSGIApplication, 89
wxWindows, 245
wzmocnienie kodu, 153
wzorzec REST, 205

X

X-App Engine-QueueName, 270
X-App Engine-TaskName, 270
X-Appengine-TaskRetryCount, 271
XMLHttpRequest, 122, 123

Y

Yahoo, 252

Z

zdalne wywoania procedur, 143
znacznik

extends, 84
servlet, 256
servlet-mapping, 256
showmessage, 85
zoony, 78

dania POST, 50

Kup książkę

Poleć książkę

background image
background image

Wyszukiwarka

Podobne podstrony:

więcej podobnych podstron