求值上下文

求值上下文(缩写为 eval context 或 eval ctx )是 Jinja 2.4 中引入的新对象,并可以在运行时激活/停用已编译的特性。

当前它只用于启用和禁用自动转义,但也可以用于扩展。

在之前的 Jinja 版本中,过滤器和函数被标记为环境可调用的来从环境中检查自动转义的状态。在新版本中鼓励通过求值上下文来检查这个设定。

之前的版本:

  1. @environmentfilter
  2. def filter(env, value):
  3. result = do_something(value)
  4. if env.autoescape:
  5. result = Markup(result)
  6. return result

在新版本中,你可以用 contextfilter() 从实际的上下文中访问求值上下文,或用 evalcontextfilter() 直接把求值上下文传递给函数:

  1. @contextfilter
  2. def filter(context, value):
  3. result = do_something(value)
  4. if context.eval_ctx.autoescape:
  5. result = Markup(result)
  6. return result
  7. @evalcontextfilter
  8. def filter(eval_ctx, value):
  9. result = do_something(value)
  10. if eval_ctx.autoescape:
  11. result = Markup(result)
  12. return result

求值上下文一定不能在运行时修改。修改只能在扩展中的用 nodes.EvalContextModifiernodes.ScopedEvalContextModifier 发生,而不是通过求值上下文对象本身。

  • class _jinja2.nodes.EvalContext(_environment, template_name=None)
  • Holds evaluation time information. Custom attributes can be attachedto it in extensions.

    • autoescape
    • TrueFalse 取决于自动转义是否激活。

    • volatile

    • 如果编译器不能在编译期求出某些表达式的值,为 True 。在运行时应该始终为 False