Jinja2 コンパイル済みテンプレートとモジュール ローダーを使用して、コンパイル済みテンプレート (Python コード) をデータストアから読み込みます。しかし、テンプレートにマクロが含まれている場合、アプリ エンジンでは機能しません: TypeError: 'NoneType' object is not callable
しかし、アプリ エンジン SDK では問題なく動作します。マクロ呼び出しをスキップすると、同じエラーが発生します。
マクロがなくても問題なく動作します。このマクロの問題に対する解決策がないため、テンプレートで Python 関数を呼び出して、マクロの機能を実装します。
更新: これは、エラーが発生するテンプレート ソース コードです。
{% extends "mainpage.html" %}
{% block form %}
{% macro test_macro(name) %}
<p>{{ name }}</p>
{% endmacro %}
<div>
{{ test_macro('John Doe') }}
</div>
{% endblock %}
そして、これはコンパイルされたテンプレート コード (フォーム ブロック部分) です。
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 では発生しませんか ??? これは名前空間の問題ですか?