码迷,mamicode.com
首页 > 其他好文 > 详细

修改jinja2模板中变量标识符

时间:2014-08-27 16:49:28      阅读:817      评论:0      收藏:0      [点我收藏+]

标签:os   使用   io   for   ar   文件   art   cti   代码   


使用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模板中变量标识符

标签:os   使用   io   for   ar   文件   art   cti   代码   

原文地址:http://my.oschina.net/yongqing/blog/307266

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!