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