codecamp

运算符拦截

New in version 2.6.

为了性能最大化, Jinja2 会让运算符直接条用类型特定的回调方法。这意味着, 通过重载Environment.call() 来拦截是不可能的。此外,由于运算符的工作 方式,把运算符转换为特殊方法不总是直接可行的。比如为了分类,至少一个特殊 方法存在。

在 Jinja 2.6 中,开始支持显式的运算符拦截。必要时也可以用于自定义的特定 运算符。为了拦截运算符,需要覆写 SandboxedEnvironment.intercepted_binops 属性。当需要拦截的运算符 被添加到这个集合, Jinja2 会生成调用 SandboxedEnvironment.call_binop() 函数的字节码。对于一元运算符, 必须替代地使用 unary 属性和方法。

SandboxedEnvironment.call_binop 的默认实现会使用 SandboxedEnvironment.binop_table 来把运算符标号翻译成执行默认 运算符行为的回调。

这个例子展示了幂( ** )操作符可以在 Jinja2 中禁用:

from jinja2.sandbox import SandboxedEnvironment

class MyEnvironment(SandboxedEnvironment):
    intercepted_binops = frozenset(['**'])

    def call_binop(self, context, operator, left, right):
        if operator == '**':
            return self.undefined('the power operator is unavailable')
        return SandboxedEnvironment.call_binop(self, context,
                                               operator, left, right)

确保始终调入 super 方法,即使你不拦截这个调用。 Jinja2 内部会调用 这个方法来对表达式求值。

API
概要
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

从其它的模板引擎切换

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }