仅在flask中调用template_filter函数一次?

时间:2015-08-31 06:57:27

标签: python flask jinja2

我有一个简单的过滤器,应该打印出传递给它的值。我创建了一个简单的模板来使用它。第一次查看页面时,该值将打印在终端中,但之后将呈现模板,但不会再次打印。为什么过滤器只被调用一次?

@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 - 

3 个答案:

答案 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)

     

用于标记依赖于上下文的过滤器的装饰器。当前的上下文   将作为第一个参数传递。

希望它有所帮助。