使用Google App Engine Helper for Django
原著: Matt Brown
译者: DaNmarner
原文链接: http://code.google.com/appengine/articles/appengine_helper_for_django.html
译文链接: http://danmarner.yo2.cn/appengine_helper_for_django_cn/
引言
Google App Engine可以运行任何WSGI兼容的程序。由于Django支持该标准,所以在Google App Engine上建立(或者移植既成的)Django程序是完全可能的。
本文将通过重新包装Django官方教程 中问卷调查程序的开始部分来让你体验建立一个Django项目并且在Google App Engine上面运行的全过程。 各步骤中针对App Engine环境的改动是本文的重点。
理解Google App Engine中的Django环境
Google App Engine提供的环境与Django程序相比有两个主要区别:
- Google App Engine不提供SQL数据库,所以你无法使用Django的标准Model类。
- Google App Engine限制了Django一部分模块的导入和使用(例如建立和删除数据库)。
我们创建了一个helper程序来省掉这些区别给你带来的麻烦。这个helper程序提供了Django在Google App Engine无法使用部分的替代实现。
获取Helper
你可以在这个开源项目的网站下载该helper模块:http://code.google.com/p/google-app-engine-django。
下载它并且解压到mysite文件夹里(DaNmarner:修改解压缩后得到的文件夹名为mysite)。
在这个文件夹里你可以看到一个标准Django工程的结构(settings.py, url.py等等)以及一个名为appengine_django的子文件夹(或者根据Django的术语,程序)。这就是整合Django和 Google App Engine的helper了。
接入Google App Engine SDK
helper程序使用到了Google App Engine SDK。如果你在使用Mac OS并且你使用了Google提供的安装程序你可以立即进入下一步(确认环境设置正确) 。Helper知道安装程序安装SDK的位置并且会自动的从那里到入它。
如果你在使用Windows和Google提供的SDK安装程序,你还需要安装Pythong for Windows扩展来让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工具。
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
更改程序名
用你喜欢的编辑器打开app.yaml,把application那一行包含的名字改为你的程序名。例如:
application: mysite
(DaNmarner:别忘了冒号后面的空格)
helper需要通过这个信息来为你的项目在你电脑上建立一个专供开发使用的datastore(DaNmarner:GAE提供的数据库)。
建立一个Django程序
你现在可以在这个项目中建立一个Django程序来包含你的models,views和tests了。你也可以使用标准的manage.py startapp命令搞定:
python manage.py startapp polls
不出意外这个命令会创建一个叫做polls的文件夹,其中包含:
__init__.py
models.py
views.py
建立Models
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 为:
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的实现细节和一些它用以测试的高级特性,以及项目的上传。
Django的版本
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里是无法使用的。
开启WSGI Handler
helper提供的app.yaml配置文件会让服务器对所有非静态文件的请求运行main.py。main.py包含了装入helper继而开启Django WSGI Handler的代码。
你可以在 my_application/static 目录下面保存CSS,图片等静态的文件。
在App Engine使用数据库后台
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来进行测试和调整。
更新Django的配置
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'
贡献你的力量
目前的helper模块仅仅实现了Django和Google App Engine整合的皮毛。如果你有一些新特性的建议或者想提交你的helper代码,请在项目站点http://code.google.com/p/google-app-engine-django/issues/entry上提交一个bug报告文件。