gpt4 book ai didi

google-app-engine - 带有宏的已编译模板不适用于 App Engine

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

我使用 Jinja2 编译模板和模块加载器从数据存储加载编译模板(python 代码)。但是当我的模板包含一个宏时,它在应用程序引擎上不起作用:TypeError: 'NoneType' object is not callable

但在 App Engine SDK 中它工作正常。当我跳过宏调用时,我收到同样的错误。

没有宏它工作正常。由于没有解决这个宏问题,我在模板中调用了一个 python 函数来实现宏的功能。

更新:这是导致错误的模板源代码:

{% extends "mainpage.html" %}
{% block form %}
{% macro test_macro(name) %}
<p>{{ name }}</p>
{% endmacro %}
<div>
{{ test_macro('John Doe') }}
</div>
{% endblock %}

这是编译后的模板代码(表单 block 部分):

def block_form(context, environment=environment):
if 0: yield None
yield u'\n'
def macro(l_name):
t_1 = []
pass
t_1.extend((
u'\n<p>',
to_string(l_name),
u'</p>\n',
))
return concat(t_1)
l_test_macro = Macro(environment, macro, 'test_macro', ('name',), (), False, False, False)
yield u'\n<div>\n\t%s\n</div>\n' % (
context.call(l_test_macro, 'John Doe'),
)

更新:经过一些调试,它成功了。但是我明白了!!!问题:我丢失了进口商品。当我在代码中重新定义导入时。它奏效了。

模块顶部:

from __future__ import division
from jinja2.runtime import LoopContext, TemplateReference, Macro, Markup, TemplateRuntimeError, missing, concat, escape, markup_join, unicode_join, to_string, identity, TemplateNotFound
__jinja_template__ = None

为了让它工作,我必须添加一个内联导入:

from jinja2.runtime import Macro     # import again ?????     
l_test_macro = Macro(environment, macro, 'test_macro', ('name',), (), False, False, False)

有人可以解释一下,我怎么会丢失我的进口商品???我只在应用引擎中遇到这个问题,在 SDK 中没有???这是命名空间问题吗?

最佳答案

我能够通过将模块添加到 sys.modules 来解决它。但是我不明白为什么当我使用宏时它在 SDK 中工作而不在 GAE 中工作

这是我更改后的模块加载器的代码。

def get_module(self, environment, template):
# Convert the path to a module name
name = template.replace('.html', '').replace('.txt','').replace('/', '.') # NO extensions
module = None

if self.package == None : # load from db and not from package
logging.info('load module : ' + name) # load module from runtimes db
if name in sys.modules : return sys.modules[name] # already imported
try :
runtime = models.Runtimes.rtimes_get_by_key_name(template)
module_code = db.Text(runtime.compiled)
module = imp.new_module(name)
exec module_code in module.__dict__
sys.modules[name] = module # add to sys modules, so no import again
return module
except (ImportError, AttributeError):
logging.error('load failed : ' + name)

else : .... # load from package

raise TemplateNotFound(template)

关于google-app-engine - 带有宏的已编译模板不适用于 App Engine,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13485294/

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