使用webpy时,修改jinja2变量标识符
重写webpy包中的template.py文件中的render_jinja类.
class my_render_jinja: """Rendering interface to Jinja2 Templates Example: render= render_jinja(‘templates‘) render.hello(name=‘jinja2‘) """ def __init__(self, *a, **kwargs): extensions = kwargs.pop(‘extensions‘, []) globals = kwargs.pop(‘globals‘, {}) from jinja2 import Environment, FileSystemLoader self._lookup = Environment(loader=FileSystemLoader(*a, **kwargs), extensions=extensions) # 添加下面两句代码,修改标识符 self._lookup.variable_start_string = ‘{{ ‘ self._lookup.variable_end_string = ‘ }}‘ self._lookup.globals.update(globals) def __getattr__(self, name): # Assuming all templates end with .html path = name + ‘.html‘ t = self._lookup.get_template(path) return t.render
有其它方式吗?
jinja2的变量标识符可以通过以下方式访问到,但是无法被修改
# 可以通过以下方式访问 import jinja2 jinja2.defaults.VARIABLE_START_STRING jinja2.defaults.VARIABLE_END_STRING jinja2.environment.VARIABLE_START_STRING jinja2.environment.VARIABLE_END_STRING # 使用以下方式赋值均无效 jinja2.defaults.VARIABLE_START_STRING = ‘{{ ‘ jinja2.defaults.VARIABLE_END_STRING = ‘ }}‘ jinja2.environment.VARIABLE_START_STRING = ‘{{ ‘ jinja2.environment.VARIABLE_END_STRING = ‘ }}‘
为什么无效?
原因是导入jinja2时,执行了jinja2包中的__init__.py文件,而__init__.py中导入Environment对象
Environment对象的构造函数__init__(variable_start_string=VARIABLE_START_STRING,variable_end_string=VARIABLE_END_STRING,...)有默认值
默认值在Environment被导入时,已经固定,之后无法被修改
所以使用赋值的方式无效
了解原因后,可以找到另外一种方法,在import前设置
__docformat__ = ‘restructuredtext en‘ __version__ = ‘2.7.2‘ # high level interface # 在此处添加下面三句代码 import defaults defaults.VARIABLE_START_STRING = ‘{{ ‘ defaults.VARIABLE_END_STRING = ‘ }}‘ from jinja2.environment import Environment, Template # loaders from jinja2.loaders import BaseLoader, FileSystemLoader, PackageLoader, DictLoader, FunctionLoader, PrefixLoader, ChoiceLoader, ModuleLoader
时间: 2024-10-28 05:28:12