修改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(variablestartstring=VARIABLESTARTSTRING,variableendstring=VARIABLEENDSTRING,...)有默认值
默认值在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
```python


上篇: angularjs过滤器(number) 下篇: 在自己的网页中调用搜索引擎