首页 > 代码库 > 修改jinja2模板中变量标识符

修改jinja2模板中变量标识符


使用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






修改jinja2模板中变量标识符