Sax*_*uce 50 google-app-engine django-templates
自app engine 1.4.2发布以来,我在生产日志中收到类似这样的警告:
您正在使用默认的Django版本(0.96).默认的Django版本将在不久的将来在App Engine版本中更改.请调用use_library()来显式选择Django版本.有关详细信息,请参阅 http://code.google.com/appengine/docs/python/tools/libraries.html#Django
这发生在我使用Django模板的每个处理程序上 - 通过以下内容:
from google.appengine.ext.webapp import template
Run Code Online (Sandbox Code Playgroud)
我想升级到1.2,但以下链接似乎并不清楚如何做到这一点(或者它是否有效):
常见的线程是插入这个:
from google.appengine.dist import use_library
use_library('django', '1.2')
Run Code Online (Sandbox Code Playgroud)
但是,应该在哪个文件中插入:
from google.appengine.ext.webapp import template?import appengine_config到那些文件?谢谢.
Sax*_*uce 56
正如Nick在systempuntoout的回答的评论中所描述的那样,我在这里导入django的所有处理程序(直接或通过或甚至只是)插入此use_library()代码:google.appengine.ext.webapp.templatedjango.utils.simplejson
from google.appengine.dist import use_library
use_library('django', '1.2')
Run Code Online (Sandbox Code Playgroud)
正如尼克所建议的那样,通过首次重构来最小化app.yaml引用的处理程序数量(即,更接近此处描述的方案1),这变得更容易.
但是,我有appstats内置配置,如果我上传后第一次去/ _ah/appstats,那么我会收到此错误:
<'google.appengine.dist._library.UnacceptableVersionError'>:请求了django 1.2,但是0.96.4.None已在使用中
我能够通过包括use_library()代码来解决这个问题appengine_config.py.
我注意到,通过对插入通话use_library()中appengine_config.py,那么它是我所有的处理程序不再需要.特别是导入的google.appengine.ext.webapp.template不需要它,因为导入webapp.template负载appengine_config.py.appstats UI导入webapp.template,这就是为什么这个问题解决了.
但是,我有一些处理程序(例如json服务)不导入webapp.template,但导入django.utils.simplejson.这些处理程序仍然需要直接调用use_library().否则,如果在新实例上首先调用这些处理程序,UnacceptableVersionError则会发生这种 情况.虽然我正在使用appengine_config.py配置appstats,意味着appengine_config.py调用所有请求,但它在页面生命周期中被调用得太晚,无法正确配置正确版本的Django.
这一切看起来一切正常,但后来我发现新的Django 1.2和我一直在使用的旧Django 0.96之间的向后不兼容.我的项目结构是这样的:
root
+- admin
| +- page_admin.html
+- page_base.html
Run Code Online (Sandbox Code Playgroud)
使用Django 0.96,在page_admin.html中有以下工作正常:
{% extends "../page_base.html" %}
Run Code Online (Sandbox Code Playgroud)
使用Django 1.2,我收到此错误:
TemplateDoesNotExist:../ page_base.html
Django 1.2的变化似乎是默认情况下,Django不允许加载原始模板目录之上的模板.
这里描述了一种解决方法,但这种方法对我来说不起作用,因为它要求模板位于模板子目录中.
解决方法是设置settings.py文件,将TEMPLATE_DIRS设置设置为项目根目录,然后将extends标记更改为仅引用"page_base.html",如此处所述.但是,我遇到了两个试图做到这一点的问题.
我使用推荐的代码来渲染我的模板,即:
template_values = { ... }
path = os.path.join(os.path.dirname(__file__), 'page_admin.html')
self.response.out.write(template.render(path, template_values))
Run Code Online (Sandbox Code Playgroud)
第一个问题是template.render()覆盖TEMPLATE_DIRS设置,将其设置为正在呈现的模板的目录.解决方案是以下代码:
template_values = { ... }
path = os.path.join(os.path.dirname(__file__), 'page_admin.html')
template_file = open(path)
compiled_template = template.Template(template_file.read())
template_file.close()
self.response.out.write(compiled_template.render(template.Context(template_values)))
Run Code Online (Sandbox Code Playgroud)
这种方法的一个缺点是template.render()缓存已编译的模板,而这段代码没有(虽然这不会很难添加).
要配置TEMPLATE_DIRS设置,我settings.py在项目中添加了一个:
PROJECT_ROOT = os.path.dirname(__file__)
TEMPLATE_DIRS = (PROJECT_ROOT,)
Run Code Online (Sandbox Code Playgroud)
然后在我的所有处理程序中,在use_library()代码之前,我设置DJANGO_SETTINGS_MODULE 如下所述:
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
Run Code Online (Sandbox Code Playgroud)
第二个问题是这不起作用 - 设置文件没有被加载,所以它TEMPLATE_DIRS是空的.
Django设置是settings.py在第一次访问时从指定的懒惰加载.问题是导入webapp.template调用django.conf.settings.configure()以尝试设置某些设置.因此,如果webapp.template在访问任何设置之前导入,则settings.py永远不会加载(因为设置访问者发现设置已存在,并且不再尝试加载).
对此的解决方案是settings.py在webapp.template导入之前强制访问设置,加载.然后,webapp.template稍后导入时,将django.conf.settings.configure()忽略其调用.因此,我将所有处理程序(和appengine_config.py)中的Django版本设置代码更改为以下内容:
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from google.appengine.dist import use_library
use_library('django', '1.2')
from django.conf import settings
_ = settings.TEMPLATE_DIRS
Run Code Online (Sandbox Code Playgroud)
实际上,我实际上将所有上述代码放在一个名为的文件中setup_django_version.py,然后从我的所有处理程序中导入它,而不是在任何地方复制这6行代码.
然后我更新了我的page_admin.html模板以包含它(即指定page_base.html相对于TEMPLATE_DIRS设置):
{% extends "page_base.html" %}
Run Code Online (Sandbox Code Playgroud)
这解决了渲染管理页面的问题.
Dav*_*ith 17
从GAE 1.5.0开始,指定要使用哪个版本的Django模板的方法要简单得多,尽管暂时没有记录.
在appengine_config.py,包括该行
webapp_django_version = '1.2'
Run Code Online (Sandbox Code Playgroud)
而已.
不再需要了use_library().
| 归档时间: |
|
| 查看次数: |
10546 次 |
| 最近记录: |