注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Code@Pig Home

喜欢背着一袋Code傻笑的Pig .. 忧美.欢笑.记忆.忘却 .之. 角落

 
 
 

日志

 
 

[AppEngine] app engine & wsgi & django 1.1  

2009-12-30 18:05:32|  分类: web |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
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.html

wsgi 更多资料
http://wsgi.org

下面是 simple wsgi demo in appengine:
------------------------------------
from google.appengine.ext import 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()
-----------------------------------

  评论这张
 
阅读(901)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017