Skip to main content

在Google App Engine中使用Django

英文原文链接:Running Django on Google App Engine
作者:Damon Kohler

翻译:將王車

在Google App Engine中使用Django

引言

Google App Engine和Django都使用WSGI标准来运行程序。因此可以在Google App Engine中使用包括中间件在内的几乎所有的Django的属性。作为开发人员,你唯一必须做的事仅仅是修改Django的数据模型,使用Google App Engine Datastore API来调用更快、更稳定的Google App Engine的数据存储。因为Django和Google App Engine对(数据)模型有着相似的定义,做为一个Django的开发人员,你将很容易修改你的程序来使用我们的数据存储。

使用Django 0.96.1

Google App Engine中已经包括Django 0.96.1,如果你使用这个最新的稳定版(译者注:本文写于2008.04,你看到译文的时候Django 1.0应该已经发布了吧),则不需要安装其它的东西。只需要简单引入你的Django组件就行了。如果你使用的是Django的开发版则需要一些额外的措施。

main.py中添加WSGI处理器

使用WSGI来启动你的Django程序只需要几个简单的步骤,导入google.appengine.ext.webapp中的util和Django中的WSGI处理组件。用样,我们使用Google App Engine来记录异常来代替使用manage.py做处理异常,所有的日志都能在Admin console中看到。需要更多关于Google App Engine日志记录方面的信息,请阅读我们的相关文章
相关代码:

import
logging, os

# 导入Google App Engine的模块
from google.appengine.ext.webapp import util

# 强制Django重新载入settings
from django.conf import settings
settings
._target = None

# 在导入任何Django的模块前必须设置该环境变量。
os
.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import logging
import django.core.handlers.wsgi
import django.core.signals
import django.db
import django.dispatch.dispatcher

def log_exception(*args, **kwds):
logging
.exception('Exception in request:')

# 记录错误。
django
.dispatch.dispatcher.connect(
log_exception
, django.core.signals.got_request_exception)

# 取消回滚事件处理器
django
.dispatch.dispatcher.disconnect(
django
.db._rollback_on_exception,
django
.core.signals.got_request_exception)

def main():
# 为WSGI创建一个Django程序
application
= django.core.handlers.wsgi.WSGIHandler()

# 使用WSGI CGI处理器来运行该程序 util.run_wsgi_app(application)

if __name__ == '__main__':
main
()
另外,你Google App Engine的app.yaml也应该看起象这样:
application: my_application
version
: 1
runtime
: python
api_version
: 1

handlers
:
- url: /static
static_dir: static

- url: /
.*
script
: main.py

你可以将css文件,图片和其它静态资源放在静态目录里。

安装Django的开发版

要使用Django的开发版,请从Django的网站下载相关文件,并将放在你程序的最顶层目录下。为了减少部署到Google App Engine时的文件数量,可以删除Django文件夹中的下列目录:
django/bin
django
/contrib/admin
django
/contrib/auth
django
/contrib/databrowse
django
/test

你需要修改main.py来除去默认的Django版本,并载入你程序所包含的版本。
import logging, os, sys

# 导入Google App Engine的模块
from google.appengine.ext.webapp import util

# 强制Django重新载入settings
from django.conf import settings
settings
._target = None

# 删除Django的标准版。
for k in [k for k in sys.modules if k.startswith('django')]:
del sys.modules[k]

# 在sys.path中添加我们程序的目录,因为我们需要从这里开始导入。
sys
.path.insert(0, os.path.abspath(os.path.dirname(__file__)))

# 在导入任何Django的模块前必须设置该环境变量。
os
.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import logging
import django.core.handlers.wsgi
import django.core.signals
import django.db
import django.dispatch.dispatcher

def log_exception(*args, **kwds):
logging
.exception('Exception in request:')

# 记录错误。
django
.dispatch.dispatcher.connect(
log_exception
, django.core.signals.got_request_exception)

# 取消回滚事件处理器
django
.dispatch.dispatcher.disconnect(
django
.db._rollback_on_exception,
django
.core.signals.got_request_exception)

def main():
# 为WSGI创建一个Django程序
application
= django.core.handlers.wsgi.WSGIHandler()

# 使用WSGI CGI处理器来运行该程序 util.run_wsgi_app(application)

if __name__ == '__main__':
main
()

更改Django的settings

因为Google App Engine不支持Django的Models,所以所有DATABASE_*的配置需要放为空。而身份验证(authentication)和管理(admin)中间件因为使用了Models所以也需要禁用,他们的功能可以分别使用App Engine Users API和Admin Console来代替。Sessions模块也依赖Models,所以也需要禁用。最后,需要用"app"来代替对"project.app"的引用和动态的决定模板目录的位置。
import os
ROOT_URLCONF
= 'urls' # 用'urls'代替'project.urls'

MIDDLEWARE_CLASSES
= (
'django.middleware.common.CommonMiddleware',
# 'django.contrib.sessions.middleware.SessionMiddleware',
# 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.doc.XViewMiddleware',
)

INSTALLED_APPS
= (
# 'django.contrib.auth',
'django.contrib.contenttypes',
# 'django.contrib.sessions',
'django.contrib.sites',
)

ROOT_PATH
= os.path.dirname(__file__)
TEMPLATE_DIRS
= (
# Put strings here, like "/home/html/django_templates" or
# "C:/www/django/templates". Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths.
ROOT_PATH
+ '/templates',
)

开发环境的使用

Google App Engine的SDK带有一个名为dev_appserver.py的开发服务器,你也能用它将你的程序部署到Google App Engine。如果你使用Google App Engine的数据存储,也不需要再使用manage.py来同步数据库。

结语

就这样!现在你就能创建的你的程序就象在Django中一样。

-------传说中的分割线-------

有打算在GAE中使用Django的话可以看看使用Google App Engine Helper for Django


Comments

Popular posts from this blog

欠税了!!!!

上个礼拜,收到政府发来的信,大概知道是和缴税有关的,由于本人英文不好,而且我们缴税的方面一向是由公司负责的,以为是普通的通知。因为同事收到的信都和我的不一样,还是决定带给老大看看是什么东西。结果把老大吓了一跳,红的,居然是红的(我怎么看都只有一点淡淡的红色。)。这意味着我欠税了。在这个资本主义国家,最恐怖的事情莫过去欠税了!!!我的工作准证很可能被吊销。 下午立马跑回公司找人事部的。我居然公司成立几十年来第一个红单。。。人事部的人说还好公司一贯信誉良好,他们会和那边联系,让我先放心。 我倒是很放心,一点都不急。其实我想回家了,和女朋友的关系这几天又到了谷底,想回去了,虽然房子钱还没有着落。

asp.net Single Sign-On(SSO) from SAP

公司的主系统是SAP的东西,有的时候老板想要一些小的新功能或是某个部门需要一个自己使用的小系统又不想买SAP的东西(贵啊),只有自己写和使用一些第三方免费或是开源的系统,这个时候就难免涉及到 Single Sign-On 。而在asp.net 2.0下是非常容易实现的。有SAP提供的“Sapsecu.dll”,“sapssoext.dll”2个dll再加上由公司SAP系统提供的"verify.pse"就足够了。 第一步 复制Sapsecu.dll到system32目录,并使用Rersrv32注册。 第二步 在项目里添加对sapssoext.dll的引用,vs2005会自动生成Interop.SAPSSOEXT.dll来让.net使用。 第三步 在你项目的根目录创建sap目录,并将SAP系统那边提供的verify.pse复制过去。位置倒到不是一定要在这里,只要你找得到就好。 第四步 在SAP系统那边,需要生成一个类似:http://yourserver/login.aspx?sso=werwerwerwe的链接,当然具体的页面需要你和那边的管理员商量来决定。这个链接是有时效性的,我在做测试的时候他们给的测试链接通常只能用一天。现在我们要做到就是我们这边的编码,在login.aspx的page_load里面实现: protected void Page_Load(object sender, EventArgs e) {   string sso= Request.QueryString["sso"];   SAPSSOEXT.SSO2Ticket objSSO = new SAPSSOEXT.SSO2Ticket();   objSSO.CryptLib = "sapsecu.dll";   string strKeypath = Server.MapPath("~/sap/verify.pse");    //放在根目录比较容易找   object tt;   tt = objSSO.EvalLogonTicket(strTicket, strKeypath, String.Empty); ...