gpt4 book ai didi

google-app-engine - App 引擎默认 Django 版本更改

转载 作者:太空宇宙 更新时间:2023-11-03 15:17:25 24 4
gpt4 key购买 nike

自从应用引擎 1.4.2 发布以来,我在生产日志中收到了这样的警告:

You are using the default Django version (0.96). The default Django version will change in an App Engine release in the near future. Please call use_library() to explicitly select a Django version. For more information see http://code.google.com/appengine/docs/python/tools/libraries.html#Django



这发生在我使用 Django 模板的每个处理程序上 - 通过以下方式:
from google.appengine.ext.webapp import template

我想升级到 1.2,但是以下链接似乎不太清楚具体如何执行此操作(或它是否有效):
  • http://code.google.com/appengine/docs/python/tools/libraries.html#Django
  • http://code.google.com/p/googleappengine/issues/detail?id=1758
  • http://code.google.com/p/googleappengine/issues/detail?id=4489
  • http://www.mediacrafters.org/post/django11-on-appengine

  • 共同点是插入这个:
    from google.appengine.dist import use_library
    use_library('django', '1.2')

    但是,应将其插入到哪个文件中:
  • 就在 appengine_config.py 中?
  • 在每个执行 from google.appengine.ext.webapp import template 的 .py 文件中?
  • 在项目中的每个 .py 文件中?
  • 在上面的1和(2或3)中,还要加上import appengine_config那些文件?
  • 在 3 或 4 中,还围绕内置函数(如 appstats、远程 api、数据存储管理等)添加包装器?
  • 还有什么?

  • 谢谢。

    最佳答案

    正如尼克在 systempuntoout 回答的评论中所描述的那样,我插入了这个 use_library()代码 from here在每个导入 django 的处理程序中(直接或通过 google.appengine.ext.webapp.template 甚至只是 django.utils.simplejson ):

    from google.appengine.dist import use_library
    use_library('django', '1.2')

    正如 Nick 所建议的那样,通过首先重构以最小化 app.yaml 引用的处理程序数量(即,更接近 scenario 1 described here ),这变得更容易了。

    但是,我已经配置了内置的 appstats,如果我在上传后首先转到/_ah/appstats,那么我会收到此错误:

    <'google.appengine.dist._library.UnacceptableVersionError'>: django 1.2 was requested, but 0.96.4.None is already in use



    我还可以通过包含 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

    使用 Django 0.96,在 page_admin.html 中包含以下内容可以正常工作:
    {% extends "../page_base.html" %}

    使用 Django 1.2,我收到此错误:

    TemplateDoesNotExist: ../page_base.html



    Django 1.2 中的变化似乎是默认情况下,Django 不允许加载位于原始模板目录之上的模板。

    描述了一种解决方法 here ,但这种方法对我不起作用,因为它要求模板位于模板子目录中。

    解决这个问题的方法是设置一个 settings.py文件,设置 TEMPLATE_DIRS设置为项目根目录,然后更改 extends标签仅供引用 "page_base.html" , 如 described here .但是,我在尝试执行此操作时遇到了两个问题。

    我正在使用 recommended code呈现我的模板,即:
    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_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_DIRS设置,我加了一个 settings.py到我的项目:
    PROJECT_ROOT = os.path.dirname(__file__) 
    TEMPLATE_DIRS = (PROJECT_ROOT,)

    然后在我所有的处理程序中,在 use_library() 之前代码,我设置了 DJANGO_SETTINGS_MODULE as described here :
    import os
    os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

    第二个问题是这不起作用 - 设置文件没有被加载,所以 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

    实际上,我实际上将上述所有代码放在一个名为 setup_django_version.py 的文件中。 ,然后从我所有的处理程序中导入它,而不是到处复制这 6 行代码。

    然后我更新了我的 page_admin.html包含此内容的模板(即指定 page_base.html 相对于 TEMPLATE_DIRS 设置):
    {% extends "page_base.html" %}

    这解决了呈现管理页面的问题。

    关于google-app-engine - App 引擎默认 Django 版本更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4994913/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com