原著: Matt Brown
譯者: DaNmarner
Google App Engine可以運作任何WSGI相容的程式。由于Django支援該标準,是以在Google App Engine上建立(或者移植既成的)Django程式是完全可能的。
Google App Engine提供的環境與Django程式相比有兩個主要差別:
Google App Engine不提供SQL資料庫,是以你無法使用Django的标準Model類。
Google App Engine限制了Django一部分子產品的導入和使用(例如建立和删除資料庫)。
我們建立了一個helper程式來省掉這些差別給你帶來的麻煩。這個helper程式提供了Django在Google App Engine無法使用部分的替代實作。
下載下傳它并且解壓到mysite檔案夾裡(DaNmarner:修改解壓縮後得到的檔案夾名為mysite)。
在這個檔案夾裡你可以看到一個标準Django工程的結構(settings.py, url.py等等)以及一個名為appengine_django的子檔案夾(或者根據Django的術語,程式)。這就是整合Django和 Google App Engine的helper了。
helper程式使用到了Google App Engine SDK。如果你在使用Mac OS并且你使用了Google提供的安裝程式你可以立即進入下一步(确認環境設定正确) 。Helper知道安裝程式安裝SDK的位置并且會自動的從那裡到入它。
最後,如果你在使用Linux,或者你在Windows或Mac OS下面使用zip源檔案,你需要在前面建立的mysite檔案夾裡複制或連結解壓縮以後的SDK為 .google_appengine (注意開頭有個點,這是個隐藏檔案夾)。
在Linux或者Mac OS力你可以通過下面的指令來實作這一點。在mysite檔案夾裡運作它:
ln -s SDK目錄 .google_appengine
為了确認環境設定正确,你可以開啟服務。確定目前目錄是mysite,輸入如下指令:
python manage.py runserver
你應該可以看到類似下面這樣的輸出:
INFO:root:Checking for updates to the SDK. INFO:root:The SDK is up to date. INFO:root:Running application appengine-django-example on port 8080: http://localhost:8080
在你的浏覽器中登陸 http://localhost:8080/ 你将會看到标準的Django歡迎頁面。在幕後helper程式重寫了Django預設的runserver指令,使之運作Google App Engine提供的 dev_appserver 指令。
你也可以在helper裡運作Django的test工具。
用你喜歡的編輯器打開app.yaml,把application那一行包含的名字改為你的程式名。例如:
application: mysite
(DaNmarner:别忘了冒号後面的空格)
helper需要通過這個資訊來為你的項目在你電腦上建立一個專供開發使用的datastore(DaNmarner:GAE提供的資料庫)。
你現在可以在這個項目中建立一個Django程式來包含你的models,views和tests了。你也可以使用标準的manage.py startapp指令搞定:
python manage.py startapp polls
不出意外這個指令會建立一個叫做polls的檔案夾,其中包含:
__init__.py models.py views.py
polls程式包含兩個model:polls和choice(DaNmarner:參見Django的官方教程)。你需要用helper和 Google App Engine提供的datastore屬性來建立它們。标準的Django Model和Property類是無法使用的。雖然你的models無法使用Django的Model類,helper會確定這些model和 Django的形式相近并且在Django裡注冊這些models。
編輯 polls/models.py 為:
<a></a> from appengine_django.models import BaseModel from google.appengine.ext import db class Poll(BaseModel): question = db.StringProperty() pub_date = db.DateTimeProperty('date published') class Choice(BaseModel): poll = db.ReferenceProperty(Poll) choice = db.StringProperty() votes = db.IntegerProperty()
激活Models
使用Google App Engine的時候你不用顯式的為model建立資料表。sql*, syncdb和validate指令也因而變成了多餘的。helper程式把他們從manage.py中删除掉了,别用它們。
要激活你的models,你隻需要編輯settings.py并且確定polls程式在INSTALLED_APPS裡。
探索API
helper子產品支援Python的互動指令界面,并且確定它使用正确的配置來通路開發過程中的資料庫服務。你可以通過熟悉的方式來進入Python互動界面:
python manage.py shell
這個互動界面沒有像伺服器中那麼多的限制。
Django管理背景
Django的管理背景和Google App Engine不支援的SQL類資料庫緊密相關。 一個可以取而代之的管理界面已經自動的由開發服務在 /_ah/admin 提供了。 例如 http://localhost:8080/_ah/admin。
Views,Forms和URLs
URL配置和view函數在Google App Engine裡沒有什麼改變。 由于你的models不是從Django Model類建立的,你将無法使用Django Form類。 Google App Engine SDK在 google.appengine.ext.db.djangoforms提供了一個相容App Engine的替代品。djangoforms子產品也可以單獨使用。
到了這裡你應該可以使用上面提供的技巧繼續開發下去。本文剩餘的部分會介紹一些helper的實作細節和一些它用以測試的進階特性,以及項目的上傳。
helper支援Django最新的穩定版(0.96)以及目前的開發版本。如果你偏愛使用穩定版,那你什麼也不用安裝。像往常一樣導入Django子產品就可以了。
要使用開發版本,你需要把Django和你的程式一起上傳。下載下傳源檔案結構然後複制到你程式的檔案結構裡:
my_application/app.yaml my_application/main.py my_application/django/*
删除以下的檔案來減少檔案數量是安全的:
django/bin django/contrib/admin django/contrib/databrowse
如果你使用以上描述的Django 0.97并且在http://appengine.google.com注冊了你的程式,你可以使用manage.py的update指令一步搞定上傳步驟:
python manage.py update
這和運作Google App Engine SDK的appcfg.py指令是等價的。你可以用同樣的方法通路rollback和vacuum_indexes指令。這些指令在 Django0.96(Google App Engine SDK包含的版本)的manage.py裡是無法使用的。
helper提供的app.yaml配置檔案會讓伺服器對所有非靜态檔案的請求運作main.py。main.py包含了裝入helper繼而開啟Django WSGI Handler的代碼。
你可以在 my_application/static 目錄下面儲存CSS,圖檔等靜态的檔案。
helper提供了一個叫做"appengine”的虛拟資料庫背景,并且讓Django自動的使用它。這個背景可以確定在app服務之外運作代碼的時候(例如互動界面,運作測試和上傳過程中)datastore會正确的初始化。
你可以删除開發時的datastore,使用manage.py的reset和flush指令。
注意:helper為其所在的每一個Django項目配置一個單獨的datastore。每個項目的datastore的路徑将和Google App Engine SDK中dev_appserver.py使用的預設路徑不同。
前文中已經提及,helper讓使用标準的Django測試架構以及建立包含可操控的測試資料的樣本成為可能。
對從helper提供的BaseModel衍生的models的系列化和去系列化支援YAML,JSON和XML。
model的ReferenceProperty成員全部使用使用str()來代表執行個體中的Key。
你可以使用manage.py标準的test,loaddata和dumpdata來進行測試和調整。
helper子產品将自動的删除和修改與Google App Engine不相容的配置。你可以用Django提供的deffsettings指令看到更新的配置和預設配置的不同部分:
python manage.py diffsettings DATABASE_ENGINE = 'appengine' DEBUG = True INSTALLED_APPS = ['appengine_django'] MIDDLEWARE_CLASSES = () ROOT_URLCONF = 'urls' ### SETTINGS_MODULE = 'mysite.settings' ### SITE_ID = 1 ### TEMPLATE_DEBUG = True TIME_ZONE = 'UTC'
本文轉自CoderZh部落格園部落格,原文連結:http://www.cnblogs.com/coderzh/archive/2008/12/01/1345139.html,如需轉載請自行聯系原作者