我有一个简单的过滤器,应该打印出传递给它的值。我创建了一个简单的模板来使用它。第一次查看页面时,该值将打印在终端中,但之后将呈现模板,但不会再次打印。为什么过滤器只被调用一次?
@app.route('/')
def hello_world():
return render_template('test.html')
@app.template_filter()
def allow_menu(menu):
print('allow_menu : {}'.format(menu))
return menu == 'test'
{% if 'test' | allow_menu %}ok{% endif %}
$ python main.py
* Running on http://0.0.0.0:9876/ (Press CTRL+C to quit)
allow_menu : test
10.10.2.62 - - [31/Aug/2015 15:50:46] "GET / HTTP/1.1" 200 -
10.10.2.62 - - [31/Aug/2015 15:50:47] "GET / HTTP/1.1" 200 -
答案 0 :(得分:1)
第一次加载模板文件时,Jinja会编译它并在内部缓存结果。由于您始终将常量const std::set<std::string, std::less<std::string>, std::allocator<std::string>>
传递给过滤器,因此Jinja通过在编译期间评估它而不是在每次渲染期间对其进行优化。
第一次使用模板时,会调用过滤器。后续渲染使用具有已评估的constsnt的缓存版本,并且不调用该函数。如果传递给过滤器的值不是常量,则会在每次渲染期间评估过滤器。
答案 1 :(得分:0)
过滤器只是这类东西的错误工具。 它们旨在处理数据,并且 - 已经提到 - 将结果缓存以供以后使用。
在这种情况下写一个扩展名(或django中的自定义标记)。
答案 2 :(得分:-1)
如需其他答案,请查看此帖:https://stackoverflow.com/a/39968378/5252007
Jinja2
有一个内置的依赖于上下文的装饰器作为详细的here,它允许从缓存中跳过过滤器。只需传递context
作为第一个参数,然后传递variable
,就像通常使用filter
一样。从引用的文件:
jinja2.contextfilter(f)
用于标记依赖于上下文的过滤器的装饰器。当前的上下文 将作为第一个参数传递。
希望它有所帮助。