wtorek, 13 maja 2008

Witaj świecie w Google App Engine

Instalujemy Google App Engine SDK Od 28 maja 2008 roku można publikować własne serwisy oparte na Google App Engine.

Po zainstalowaniu można sobie wsiąść się za tworzenie prostej aplikacji w Django. Bo GAE opiera się na silniku frameworka Django. Jeżeli komuś zależy na testowaniu aplikacji w klasycznym Django w Polsce to może wypróbować hosting na megiteam.pl przez 15 dni.

Po zainstalowaniu GAE SDK zrobiłem folder C:\appEngine, następnie utworzymy podkatalog witaj i tak do katalogu C:\appengine\witaj dodałem plik konfiguracyjny app.yaml oraz plik skryptu witaj.py

Ponieważ Google App Engine opiera się na WCGI więc trzeba stworzyć plik konfiguracyjny app.yaml Kod pliku app.yaml:


# nazwa aplikacji
application: appengine
#wersja aplikacji
version: 1
#silnik wykonawczy
runtime: python
#wersja silnika wykonawczego
api_version: 1

#lista adresów URL które maja być obsługiwane
handlers:
- url: /.*
script: witaj.py
# powyżej pokazuje że wszystkie adresy maja
# być obsługiwane przez skrypt witaj.py


Pliki powinny być zakodowane w UTF-8. Oto kod w pliku witaj.py

print 'Content-Type: text/plain'
print ''
print 'Witaj świecie'


W folderze C:\appengine\ zrobimy plik wsadowy start.bat z takim kodem

dev_appserver.py -d witaj


Teraz uruchomiamy plik C:\appengine\start.bat, a potem wpisujemy w przeglądarce internetowej http://localhost:8080/.

Tak wygląda pierwszy krok. Drugi krok to uruchomienie panela administracyjnego
http://localhost:8080/_ah/admin/datastore z przeglądarką danych i z interaktywna konsolą.

Następną aplikację zrobimy na bazie Djangoguestbook. Jest ona w folderze
C:\Program Files\Google\google_appengine\demos\guestbook

Robimy folder C:\appengine\djangoguestbook. W tym folderze dodajemy plik konfiguracyjny app.yaml z takim kodem

application: djangoguestbook
version: 1
runtime: python
api_version: 1

handlers:
- url: .*
script: main.py


Tworzymy plik main.py z takim kodem

import os
import sys
# Google App Engine imports.
from google.appengine.ext.webapp import util

# tworzymy własny plik z ustawieniami
from django.conf import settings
settings._target = None
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

# Import various parts of Django.
import django.core.handlers.wsgi
import django.core.signals
import django.dispatch.dispatcher
import django.db


def main():
# Wtworzymy aplikacje Django WSGI.
application = django.core.handlers.wsgi.WSGIHandler()

# Uruchamiamy WSGI CGI z ta naszą aplikacja.
util.run_wsgi_app(application)

# konstruktor
if __name__ == '__main__':
main()


Skoro już wiemy co mamy uruchamiać, to następnie trzeba zrobić plik z ustawieniami aplikacji setting.py Oto kod w pliku setting.py:

import os

DEBUG = True
TEMPLATE_DEBUG = DEBUG
APPEND_SLASH = False
LANGUAGE_CODE = 'en-us'
SITE_ID = 1

# If you set this to False, Django will make some
# optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# URL prefix for admin media -- CSS, JavaScript and images.
# Make sure to use a
# trailing slash.
# Examples: "http://foo.com/media/", "/media/".
ADMIN_MEDIA_PREFIX = '/media/'

# List of callables that know how to import templates from various sources.
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.load_template_source',
'django.template.loaders.app_directories.load_template_source',
)

MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.doc.XViewMiddleware',
)
# odnośnik do pliku konfiguracyjnego urls.py
ROOT_URLCONF = 'urls'
# odnośnik do folderu w którym jest aplikacja
ROOT_PATH = os.path.dirname(__file__)
#wskazuje na miejsce gdzie są szablony Django
TEMPLATE_DIRS = (
os.path.join(ROOT_PATH, 'templates')
)


Można zauważyć, że odwołujemy się do adresów URL w pliku urls.py, a oto jego kod:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
(r'^$', 'views.index'),
(r'^sign$', 'views.sign'),
)

Widać w nim 2 adresy internetowe: jeden do wyświetlania formularza do wpisywania danych, a drugi do rejestracji, jeśli ktoś nie jest jeszcze zalogowany. Tak więc ustawiliśmy aplikację Django, teraz trzeba zająć się danymi aplikacji czyli jej modelem oraz widokami w szablonach.

Na początek zajmiemy się danymi, które mają być przechowywane w bazie danych na serwerach Google obsługujących GAE. W praktyce lokalny serwer WWW umieszcza swoje dane w plikach. Tworzymy plik model.py

from google.appengine.ext import db

class Post(db.Model):
author = db.UserProperty()
message = db.StringProperty(multiline=True, required=True)
date = db.DateTimeProperty(auto_now_add=True)

Utworzyliśmy tabelę Post z 3 kolumnami (author, message, date) W tej tabeli będą zapisywane dane z formularza i jak odczytywane poprzednie wpisy. Cala logika aplikacji oparta o obsługę widoków jest trzymana w pliku views.py

import datetime

from django.http import HttpResponseRedirect
from django.shortcuts import render_to_response

from google.appengine.api import users

from models import Post
from forms import GuestbookForm

def index(request):
query = Post.gql('ORDER BY date DESC')
form = GuestbookForm()
return render_to_response('index.html',
{'posts': query.fetch(20),
'form': form
}
)

def sign(request):
form = GuestbookForm(request.POST)
if form.is_valid():
post = Post(message=form.clean_data['message'])
if users.GetCurrentUser():
post.author = users.GetCurrentUser()

post.put()

return HttpResponseRedirect('/')


Trzeba zwrócić uwagę na to, że do obsługi zapytań używamy dialektu GQL, który jest podobny do SQL. Nasz aplikacja ma też odrębna klasę wiążącą formularz z danymi czyli klasę GuestbookForm, której kod jest w pliku forms.py

from django import newforms as forms

class GuestbookForm(forms.Form):
message = forms.CharField(label='Sign the Guestbook', widget=forms.Textarea())


Widzimy jak za pomocą modułu Django newforms tworzy się nowe pole formularza, które zostanie użyte w szablonach.

Teraz utworzymy nowy katalog templates. A w katalogu C:\appengine\djangoguestbook\templates dodajemy plik index.html, z takim kodem:



W ten sposób pozostało nam zrobienie skryptu djangoguestbook.bat w katalogu C:\appengine z takim skryptem:

dev_appserver.py -d djangoguestbook


Wystarczy uruchomić ten plik C:\appengine\djangoguestbook.bat
I zobaczyć jak to działa.

1 komentarz:

GordonFreeman pisze...

Dzięki, bardzo przydatny post. Niewiele jest informacji na razie o Django + Google apps.
Kilka drobiazgów:
1) Literówka: powinno być settings.py, nie setting.py
2)Literówka powinno być models.py, nie model.py
3) Byłoby miło dostać całośc w postaci zipa (miałem trochę problemów z polskimi literami przy copy-paste, myślę że moje pliki nie są UTF8 jak powinny)
Pozdrawiam i dzięki!