Google app engine 应用程序引擎默认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

自从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_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')
但是,应将其插入到哪些文件中:

  • 只是在appengine_config.py中
  • 在google.appengine.ext.webapp导入模板的每个.py文件中,
  • 在项目中的每个.py文件中
  • 在上面的1和(2或3)中,是否还要将
    import appengine\u config
    添加到这些文件中
  • 在3或4中,还可以围绕内置函数(如appstats、RemoteAPI、datastore admin等)添加包装器
  • 还有别的吗

  • 谢谢。

    根据正确链接的提示,您只需在
    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'