在Google App Engine上用zipimport引入新版的Django

本文介绍如何在Google App Engine (GAE) 上集成Django 1.0,包括精简Django文件以符合GAE的文件数量和大小限制,并通过修改main.py文件来禁用旧版本并引入新版本。

很久以前就在注册了GAE,好像只有联通的GSM号才能注册,幸好上次卡丢了后办了张联通的。

言归正传,GAE自带的django是0.96版,我是追新一族,既然有1.0干嘛不用呢。官方原来有一篇文章介绍如何引入django开发版到GAE的,同样适用于1.0,具体是把django解压到自己的应用目录下,然后在main.py加几行代码禁用0.96并引入新版本,不过那篇文章有两行代码没有缩进,问题不大。但是这个方法不太好,由于GAE有1000个文件数量限制,django的文件太多,精简后还有400多,万一以后要引入javascript、css库或者写的程序文件多了就不好办了。

原文找不到了,今天搜索的时候发现官方又出来一篇文章 ,介绍把django压缩包放到应用目录下然后用zipimport引入到GAE。由于GAE还限制单个文件不能超过1M,所以必须精简django,推荐删除以下文件:

  1. django/conf/locale/* (如有需要保留en和zh_CN)
  2. django/contrib/admin (这个被google禁用了)
  3. django/contrib/admindocs
  4. django/contrib/gis (这个是地理信息模块比较大)
  5. django/*.pyc (这类文件不必要)

压缩一下就只有649KB了,好将这个压缩包放到自己的应用目录下

然后就是改main.py了

import logging, os, sys

# Google App Engine imports.
from google.appengine.ext.webapp import util

# Remove the standard 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.
if os.name=='nt':
    os.unlink=lambda :None

# Add Django 1.0 archive to the path.
django_path = 'django.zip'
sys.path.insert(0, django_path)

# 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 request:')
    # Log errors.
    django.dispatch.dispatcher.connect(log_exception, django.core.signals.got_request_exception)
    # Unregister the rollback event handler.
    django.dispatch.dispatcher.disconnect(django.db._rollback_on_exception,django.core.signals.got_request_exception)

def main():
  # Re-add Django 1.0 archive to the path, if needed.
  if django_path not in sys.path:
    sys.path.insert(0, django_path)

  # Create a Django application for WSGI.
  application = django.core.handlers.wsgi.WSGIHandler()

  # Run the WSGI CGI handler with that application.
  util.run_wsgi_app(application)

if __name__ == '__main__':
  main()

 接下来就可以写自己的应用了

P.S.:已知一个bug,使用压缩包的话无法使用国际化即设置的语言,有空我发到Google group上去反映一下。其实这个方法和以前是一样的,只不过django_path不同罢了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值