只在 flask 中调用 template_filter 函数一次?
Calling template_filter function in flask only once?
我有一个简单的过滤器,它应该打印出传递给它的值。我创建了一个简单的模板来使用它。第一次查看页面时,该值会打印在终端中,但在呈现模板后不会再次打印。为什么过滤器只被调用一次?
@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 -
第一次加载模板文件时,Jinja 会对其进行编译并在内部缓存结果。由于您总是将常量 'test'
传递给过滤器,Jinja 通过在编译期间评估它来优化它,而不是在每次渲染期间。
第一次使用模板时,会调用过滤器。后续渲染使用缓存版本和评估的 constsnt,并且不调用该函数。如果传递给过滤器的值不是常量,则过滤器将在每次渲染期间进行评估。
过滤器对于此类事情来说是错误的工具。
它们旨在处理数据并 - 如前所述 - 缓存结果供以后使用。
在这种情况下写一个扩展(或 django 中的自定义标签)。
如需备选答案,请查看此 post:
Jinja2
有一个内置的上下文相关装饰器,详见 here 允许您的过滤器从缓存中跳过。只需将 context
作为第一个参数传递,然后像通常使用 filter
那样传递 variable
。来自引用的文档:
jinja2.contextfilter(f)
Decorator for marking context dependent filters. The current Context
will be passed as first argument.
希望对您有所帮助。
我有一个简单的过滤器,它应该打印出传递给它的值。我创建了一个简单的模板来使用它。第一次查看页面时,该值会打印在终端中,但在呈现模板后不会再次打印。为什么过滤器只被调用一次?
@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 -
第一次加载模板文件时,Jinja 会对其进行编译并在内部缓存结果。由于您总是将常量 'test'
传递给过滤器,Jinja 通过在编译期间评估它来优化它,而不是在每次渲染期间。
第一次使用模板时,会调用过滤器。后续渲染使用缓存版本和评估的 constsnt,并且不调用该函数。如果传递给过滤器的值不是常量,则过滤器将在每次渲染期间进行评估。
过滤器对于此类事情来说是错误的工具。 它们旨在处理数据并 - 如前所述 - 缓存结果供以后使用。
在这种情况下写一个扩展(或 django 中的自定义标签)。
如需备选答案,请查看此 post:
Jinja2
有一个内置的上下文相关装饰器,详见 here 允许您的过滤器从缓存中跳过。只需将 context
作为第一个参数传递,然后像通常使用 filter
那样传递 variable
。来自引用的文档:
jinja2.contextfilter(f)
Decorator for marking context dependent filters. The current Context will be passed as first argument.
希望对您有所帮助。