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

Python中的self

习惯上,任何Python类方法的第一个参数(对当前实例d的引用)都叫做self。这个参数扮演着C++或Java中的保留字this的角色,但self在Python中并不是一个保留字,它只是一个命名习惯。虽然如此,也请除了self之外不要使用其它的名字,这是一个非常坚固的习惯。 出自:《Dive Into Python》

Google Notebook整合了Google 书签

FF上一直装有Google笔记本的插件,一直没有到一面上去看,今天无意点到。发现多了个叫“Unfiled”的记事本,记得自己并未建过这么个东西,进去一看才发现,其实就是我的Google书签: 并且右下角也多了“Labels”,且与我Google书签中的相同。 其实人家的右上角的“ New features! ”里说得很清楚: Integration with Google Bookmarks Notebook is now integrated with Google Bookmarks. Your bookmarks will show up as a special Unfiled notebook, making Google Notebook a single place to collect and organize interesting web pages. To publish and collaborate, just drag and drop bookmarks into notebooks.

sp_tables的@table_type参数

打算写个工具,直接从数据库按字段生成类,使用到了sp_tables,遇到了很奇怪的问题。 查MSDN可以知道:sp_tables的参数之一:@table_type varchar(100) 可选项有: TABLE 、 SYSTEMTABLE 、 VIEW 。 我写了如下代码: Databasedb = DatabaseFactory.CreateDatabase(); DbCommand com = new SqlCommand(); com.CommandText = "sp_tables"; com.CommandType = CommandType.StoredProcedure; com.Parameters.AddWithValue("@table_type", "TABLE"); IDataReader reader = db.ExecuteReader(com); 却拿不到任何东西。不加@talbe_type的话又返回了大量的系统VIEW。 查看sp_tables的源码,在关于@talbe_type的部分发现如下的东西: if (charindex('''TABLE''',@table_type) 0) 倒回去 仔细 看MSDN,参数的说明部分: [ , [ @table_type = ] "'type'" ] 比一般的多了2个",而且下面也有说明 Single quotation marks must enclose each table type, and double quotation marks must enclose the whole parameter. Table types must be uppercase. If SET QUOTED_IDENTIFIER is ON, each single quotation mark must be doubled and the whole parameter must be enclosed in single quotation marks. 太大意了。 修改代码: com.Parameters.AddWithValue(...