[英]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
问题是:
至少要打包的模式可以很好地过滤到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.