繁体   English   中英

在Jinja2中,扩展程序应如何添加自定义过滤器?

[英]In Jinja2, how should an extension add custom filters?

我正在研究Jinja2 随附的jinja2.ext.InternationalizationExtension代码。

我知道可以通过tags属性添加标签 当其中一个字符串是{%%}块中的第一个标记时,Jinja2模板解析器将放弃控制并调用用户代码。

class InternationalizationExtension(Extension):
   """This extension adds gettext support to Jinja2."""
    tags = set(['trans'])

我从代码中了解到,扩展可以通过调用Environment.extend向环境添加属性。 对于jinja2.ext.InternationalizationExtension,这是通过__init__方法完成的:

def __init__(self, environment):
    Extension.__init__(self, environment)
    environment.globals['_'] = _gettext_alias
    environment.extend(
        install_gettext_translations=self._install,
        install_null_translations=self._install_null,
        install_gettext_callables=self._install_callables,
        uninstall_gettext_translations=self._uninstall,
        extract_translations=self._extract,
        newstyle_gettext=False
    )

我知道通过向Environment.filters中注册函数来添加自定义过滤器:

def datetimeformat(value, format='%H:%M / %d-%m-%Y'):
    return value.strftime(format)
environment.filters['datetimeformat'] = datetimeformat

问题是:

  • 是否建议扩展添加新的过滤器,而不仅仅是环境的标签和属性? 文档建议这应该是普遍做法)
  • 在扩展子类中的哪个位置应该执行此操作? __init__中,可以使用对环境的引用,因此原则上,以上代码可以放在__init__方法中。
  • 从概念上讲,可以在__init__中这样做吗? 我个人不喜欢从其他对象的构造函数中更改对象状态,但是在Jinja2中,它似乎很惯用,足以使其成为正式的扩展名(我正在谈论更改Environment.globals并从InternationalizationExtension .__ init__调用Environment.extend )。 。

编辑

至少要打包的模式可以很好地过滤到Python模块中。 但是,无法从模板内部调用此install功能(例如,通过使用扩展名创建的自定义CallBlock ),因为在实例化模板后不应编辑环境。

def greet(value):
    return "Hello %s!" % value

def curse(value):
    return "Curse you, %s!" % value

def ohno(value):
    return "Oh, No! %s!" % value

def install(env):
    env.filters['greet'] = greet
    env.filters['curse'] = curse
    env.filters['ohno'] = ohno

是否建议扩展添加新的过滤器,而不仅仅是环境的标签和属性?

仅在需要它们时。 否则,为什么要使您的代码过于复杂? 过滤器是编写或扩展其他扩展的非常常见的用例,而作者最有可能将其放入其中,因为他们希望这种情况会发生。

在扩展子类中的哪个位置应该执行此操作?

它必须在调用时完成,因此,如果您不直接将其放入__init__中 ,则需要将其放入通过__init__调用的帮助方法中。

从概念上讲,可以在__init__中这样做吗?

只要您的代码的其他用户可以理解它的作用,那就很好了。 最简单的解决方案通常是最好的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM