在Bottle框架中为Jinja2配置自定义pandoc过滤器提示未找到
问题原因及解决方法
问题根源
你自行创建的jinja2.Environment实例与Bottle框架内部渲染模板时使用的Jinja2环境完全独立,你在自定义实例上注册的过滤器不会被Bottle的template函数读取到,才会出现过滤器已注册但渲染时找不到的报错。
解决方法
方法一:直接修改Bottle默认Jinja2模板的过滤器配置
这是最简便的方案,不需要重构现有环境配置:
from bottle import get, run, jinja2_template as template, Jinja2Template import pypandoc def pandoc_convert(s): return pypandoc.convert_text(s, format='md', to='html5') # 给Bottle默认的Jinja2环境新增过滤器,不覆盖原有默认过滤器 Jinja2Template.defaults.setdefault('filters', {})['pandoc'] = pandoc_convert @get("/foo") def foo(): return template('foo.html') run(host='localhost', port=8080, debug=True)
方法二:将自定义的Jinja2环境注入到Bottle模板适配器
如果你需要自定义Jinja2的加载器、全局变量等其他配置,可直接把你创建的环境绑定给Bottle的Jinja2模板类:
from bottle import get, run, jinja2_template as template, Jinja2Template from jinja2 import Environment, FileSystemLoader import pypandoc def pandoc_convert(s): return pypandoc.convert_text(s, format='md', to='html5') # 自定义Jinja2环境,可根据需求配置模板路径、语法规则等 custom_env = Environment( loader=FileSystemLoader('views'), # 替换为你的模板目录路径 autoescape=True ) # 注册自定义过滤器 custom_env.filters['pandoc'] = pandoc_convert # 把自定义环境绑定给Bottle的Jinja2模板类,后续渲染都会使用该环境 Jinja2Template.env = custom_env @get("/foo") def foo(): return template('foo.html') run(host='localhost', port=8080, debug=True)
两种方案修改完成后,模板内的{{ "This is *some* markdown" | pandoc }}调用无需调整即可正常生效。
内容的提问来源于stack exchange,提问作者somenxavier
相关产品推荐
相关产品推荐

