Google app engine 应用程序引擎默认Django版本更改
自从app engine 1.4.2发布以来,我的生产日志中出现了如下警告: 您正在使用默认的Django 版本(0.96)。默认的Django 版本将在应用程序引擎中更改 在不久的将来发布。请 调用use_library()以显式 选择Django版本。更多 资料见 这发生在我使用Django模板的每个处理程序上,通过以下方式:Google app engine 应用程序引擎默认Django版本更改,google-app-engine,django-templates,Google App Engine,Django Templates,自从app engine 1.4.2发布以来,我的生产日志中出现了如下警告: 您正在使用默认的Django 版本(0.96)。默认的Django 版本将在应用程序引擎中更改 在不久的将来发布。请 调用use_library()以显式 选择Django版本。更多 资料见 这发生在我使用Django模板的每个处理程序上,通过以下方式: from google.appengine.ext.webapp import template import os os.environ['DJANGO_SET
from google.appengine.ext.webapp import template
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
我想升级到1.2,但是下面的链接似乎不太清楚具体如何做到这一点(或者它是否工作):
from google.appengine.dist import use_library
use_library('django', '1.2')
但是,应将其插入到哪些文件中:
import appengine\u config
添加到这些文件中谢谢。根据正确链接的提示,您只需在
main.py
脚本处理程序的开头添加此函数。如Nick在SystemPuntoot的回答中所述,我在导入django的每个处理程序中插入了此use_library()
代码(直接或通过google.appengine.ext.webapp.template
或仅通过django.utils.simplejson
):
正如Nick所建议的,通过第一次重构使app.yaml引用的处理程序的数量最小化(即,更接近于)使这变得更容易
但是,我已经配置了appstats内置项,如果我在上传后第一次转到/_ah/appstats,那么我会得到以下错误:
:
已请求django 1.2,但
0.96.4.没有一个已在使用中
我可以通过在appengine\u config.py
中包含use\u library()
code来解决这个问题
我注意到,通过插入对use_library()的调用
在appengine\u config.py
中,我的所有处理程序都不再需要它。特别是那些导入google.appengine.ext.webapp.template
的处理程序不需要它,因为导入webapp.template
会加载appengine\u config.py
。appstats UI导入webapp.template
,我需要它这就是为什么解决了这个问题
但是,我有一些处理程序(例如json服务),它们不导入webapp.template
,而是导入django.utils.simplejson
。这些处理程序仍然需要直接调用use\u library()
。否则,如果在新实例上首先调用这些处理程序,则会出现不可接受的VersionError
。虽然我使用appengine_config.py
来配置appstats,这意味着调用appengine_config.py
来检测所有请求,但在页面生命周期中调用它太晚,无法正确配置Django的正确版本
起初,这一切似乎都很正常,但后来我发现新的Django 1.2和我一直使用的旧的Django 0.96之间存在向后不兼容的问题。我的项目结构如下:
root
+- admin
| +- page_admin.html
+- page_base.html
对于Django 0.96,在page_admin.html中使用以下内容效果良好:
{% extends "../page_base.html" %}
在Django 1.2中,我遇到了以下错误:
TemplateDoesNotExist:../page_base.html
Django 1.2中的变化似乎是默认情况下,Django不允许加载位于原始模板目录之上的模板
本文描述了一种解决方法,但这种方法对我来说不起作用,因为它要求模板位于模板子目录中
解决方法是设置一个settings.py
文件,将TEMPLATE\u DIRS
设置设置为项目根目录,然后将extends
标记更改为仅引用“page\u base.html”
,如图所示。然而,我在尝试这样做时遇到了两个问题
我正在使用渲染我的模板,即:
template_values = { ... }
path = os.path.join(os.path.dirname(__file__), 'page_admin.html')
self.response.out.write(template.render(path, template_values))
第一个问题是template.render()
覆盖template\u 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)))
但是,这种方法的一个缺点是template.render()
缓存编译好的模板,而这段代码不缓存编译好的模板(尽管这并不难添加)
为了配置TEMPLATE\u DIRS
设置,我在项目中添加了settings.py
:
PROJECT_ROOT = os.path.dirname(__file__)
TEMPLATE_DIRS = (PROJECT_ROOT,)
然后在我所有的处理程序中,在使用库()之前,我设置DJANGO\u设置\u模块
:
第二个问题是,这不起作用-未加载设置文件,因此模板\u DIRS
为空
Django设置在第一次访问时从指定的settings.py
延迟加载。问题是导入webapp.template
调用Django.conf.settings.configure()
尝试设置一些设置。因此,如果在访问任何设置之前导入了webapp.template
,则永远不会加载settings.py
(因为设置访问者发现设置已经存在,并且不再尝试加载)
解决方法是,在导入webapp.template
之前,强制访问设置,加载settings.py
。然后在以后导入webapp.template
时,调用django.conf.settings.configure()
被忽略。因此,我将所有处理程序(和appengine\u config.py
)中的Django版本设置代码更改为以下内容:
from google.appengine.ext.webapp import template
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
实际上,我将上述所有代码放在一个名为setup\u django\u version.py的文件中,然后
{% extends "page_base.html" %}
webapp_django_version = '1.2'