在App Engine下运行Django 1.2
我不知道App Engine是从什么时候开始默认支持Django 1.2的,好像支持的时间不长,我懒得去求证了,反正你去下载最新的SDK准支持,保准支持。要在App Engine下运行Django通常有两种方法:一种是使用django-nonrel,它是django的一个nosql分支,它可能不太稳定,但如果你要将已有应用移植到app engine上,这是最快捷的方法,你仍然可以使用django的models, forms,应用几乎不需要改动,当然由于两者使用不同类型的数据库,数据存储模型可能要针对app engine微调一下。第二种方法就是使用标准的django,这种方法的缺点是不能再使用django的models,app engine有一套自己的数据模型。这里讨论后一种方法。
虽然app engine自带django,但使用django并不那么简单,当然这么大众的问题早就已经有解决方案了,那就是google-app-engine-django,从这里下载压缩包,将它解压。
将解压的目录appengine_helper_for_django改成你应用的名称,例如shared-accounting,同时修改app.yaml中application的值为应用名称。appengine helper最多只支持django 1.1,要支持1.2需要修改它的源代码。编辑appengine_django目录下的__init__.py,在171行将它改成(在'1.1'前面加上'1.2'):
AUTHENTICATION_BACKENDS = ( "your authentication backend",)
最后实现用户注册、登陆等view,整个过程工作量不小。大家可以看我后面给出的demo。
数据访问
app engine和django自带的数据模型有很大不同,其内部一个是BigTable,一个是MySQL等关系型数据库。app engine的数据模型使用的是google.appengine.ext.db.Model,appengine helper提供一层薄的封装appengine_django.models.BaseModel,我没有用BaseModel直接使用appengine的db.Model,db.Model其实在很大程序上模仿的是django,它甚至还有和django的ModelForm相对应的google.appengine.ext.db.djangoforms。
时区
app engine内部都使用utc时间,我刚开始将settings的TIMEZONE设置成'Asia/Shanghai',结果碰到很诡异的问题,有时时间返回的是本地时间,有时返回的是utc时间。所以在开发app engine应用时最好数据存储都使用utc时间,然后在展现时将它转成本地时间。
说了这么多,希望能给大家在app engine上开发django程序有一些帮助。我写了一个小网站(不仅仅是个demo),它是帮助管理合租、聚餐等集体费用的一个工具性网站,网址在是http://shared-accounting.appspot.com(需要翻~~墙,推荐IPv6,方法自行google)。代码在这里。