AppEngine Homepage
http://code.google.com/appengine/My App List
https://appengine.google.com/AppEngine 是个好玩的东西,按着步骤一步步玩。其后台对于 python 使用了 wsgi 标准。
wsgi 是个啥东西?看这,让你5分钟明白啥是 wsgi。
http://ivory.idyll.org/articles/wsgi-intro/what-is-wsgi.htmlwsgi 更多资料
http://wsgi.org下面是 simple wsgi demo in appengine:
------------------------------------
from google.appengine.ext imp
ort webapp
from google.appengine.ext.webapp.util import run_wsgi_app
def simple_wsgi_app(environ, start_response):
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return ['Hello WSGI!']
def main():
run_wsgi_app(simple_wsgi_app)
if __name__ == '__main__':
main()
-----------------------------------
至于如何将 django 整合进来,google 已经有很好的文章介绍了。此方法已 too old,请继续阅读本文。
http://code.google.com/intl/zh-CN/appengine/articles/django.html
不过 django 1.1 结构上有些调整,上面文章中的 main.py 需要改改,如下:
-----------------------------------
import logging, os, sys
# Google App Engine imports
from google.appengine.ext.webapp.util import run_wsgi_app
# Remove the appengine version of Django
for k in [k for k in sys.modules if k.startswith('django')]:
del sys.modules[k]
# Force sys.path to have our own directory first, in case we want to import from it.
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)))
# Must set this env var *before* importing any part of Django
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
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 reqeust:')
# Log errors
django.db.signals.got_request_exception.connect(log_exception)
# Unregister the rollback event handler
django.db.signals.got_request_exception.disconnect(django.db._rollback_on_exception)
def main():
app = django.core.handlers.wsgi.WSGIHandler()
run_wsgi_app(app)
if __name__ == '__main__':
main()
-----------------------------------
上面的方法,虽然可以工作,但需要将 django 1.1 所有代码发布到 appengine,太大。
http://www.indexofire.com/blog/?p=495
其实现在 GAE 已经可以支持 django 1.1 了。如下,使用 use_library 即可。在本地,use_library
只是删除了 sys.path 中所有以 'lib/django' 结尾的路径(google_appengine/lib/django),只要本地
正确安装了 django 1.1,则可正确加载。
-----------------------------------
import logging, os
import wsgiref.handlers
from google.appengine.dist import use_library
use_library('django', '1.1')
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from django.core.handlers.wsgi import WSGIHandler
import django.db
def log_exception(*args, **kwds):
logging.exception('Exception in reqeust:')
django.db.signals.got_request_exception.connect(log_exception)
django.db.signals.got_request_exception.disconnect(django.db._rollback_on_exception)
def main():
app = WSGIHandler()
wsgiref.handlers.CGIHandler().run(app)
if __name__ == '__main__':
main()
-----------------------------------
评论