在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'):
  for check_version in ('1.2', '1.1', '1.0'):
    try:
      use_library('django', check_version)
      return
    except UnacceptableVersionError:
      pass


基本上就是这么简单,然后就可以运行: python manage.py runserver启动服务器,然后就可以在浏览器在访问http://localhost:8000。然后可以用python manage.py startapp创建新的app,之后一切与标准django类似。实际运行中还有一些问题要注意。


Session管理

只要有用户,基本上就会有session,在gae中要开启session很简单,和标准django一样,只需要在settings.py中开启SessionMiddleware就可以了。


用户Authentication

appengine helper替换掉标准django中的authentication,其内部实现使用app engine的认证,这意味着在可以使用gmail帐户(以及其它支持openid的账户),如果你的应用是这样的,那么只需要启用AuthenticationMiddleware就可以了。如果应用想要自己注册帐户,那么首先要禁用appengine替换标准的authentication,还是在appengine_django目录下的__init__.py,将第557行的InstallAuthentication(settings)注释掉,然后从头实现你的用户模型,实现AuthenticationBackend,并在settings.py中启用。
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)。代码在 这里。

你可能感兴趣的:(Django,Google,Python,EXT,GAE)