在金字塔下为jinja2添加自定义过滤器

Red*_*ron 5 python jinja2 pyramid

之前已经问这个问题,但是接受的解决方案(由问题海报自己给出)说我们可以直接将新过滤器添加到jinja2.filter.FILTER.

但是在jinja2文档中,建议将过滤器添加到环境中.

我正在金字塔下开发一个应用程序,需要定义我的自定义过滤器并执行以下操作.

from jinja2 import Environment

#Define a new filter
def GetBitValue(num,place):
    y = (num >> (place-1)) & 1
    return y

env = Environment()
env.filters['getbitvalue'] = GetBitValue
Run Code Online (Sandbox Code Playgroud)

这个代码片段应该放在哪里?

我尝试将它放在视图文件中但显然不起作用.

如果我把它__init__.py放进去,我该如何确保jinja2接收它?我的意思是如何将env金字塔下的jinja2设置发送回去?

Thi*_*ter 11

假设您正在使用pyramid_jinja2,您可以pyramid_jinja2.get_jinja2_environment()通过configurator实例使用来访问环境.

但是,显然你也可以通过金字塔配置文件注册它们而无需直接访问env:

[app:yourapp]
    # ... other stuff ...
    jinja2.filters =
        # ...
        getbitvalue = your_package.your_subpackage:GetBitValue
Run Code Online (Sandbox Code Playgroud)

  • 如果我不想在配置中指定怎么办?它不是真正的配置,是吗?它应该在代码内部连线.Config用于可移动位,对于dev/prod阶段将是不同的. (2认同)

Tan*_*anj 6

为了完整起见,这将是您在代码中注册过滤器的方式.

# __init__.py
def main(global_config, **settings):
    #....
    config = Configurator(settings=settings)
    config.include('pyramid_jinja2')
    config.commit() # this is needed or you will get None back on the next line
    jinja2_env = config.get_jinja2_environment()
    jinja2_env.filters['getbitvalue'] = GetBitValue
Run Code Online (Sandbox Code Playgroud)