修改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
时间: 2024-08-26 06:09:48

修改jinja2模板中变量标识符的相关文章

Flask08 包含(include)、继承(extends)、宏???、模板中变量的来源

1 包含 直接把另一个文件的内容,复制粘贴过来 {% include "模板路径" %} 注意:模板都是放在 templates 这个文件夹下面的,可以在里面新建文件夹来进行分离:    例如:{% include "include/header.html" %} <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"

Django 模板中 变量 过滤器 标签 的使用方法

一.变量 1.变量的形式是:{{variable}}, 当模板引擎碰到变量的时候,引擎使用变量的值代替变量.    2.使用dot(.)能够访问变量的属性    3.当模板引擎碰到dot的时候,查找的顺序是什么样子呢?        a.字典查找,例如:foo["var1"]        b.属性查找,例如:foo.bar        c.方法查找,例如:foo.bar()        d.list-index查找,例如foo[bar] 注意:方法查找比一般的查找要复杂一些 (1

salt jinja模板中变量使用pillar的几种方法

先转载下jinja模板中使用变量的方法,后文主要讲解pillar的变量使用方法 一.jinja模版的使用方法: 1.file状态使用template参数 - template:jinja 2.模版文件里面变量使用{{名称}},例如{{PORT}} 变量使用Grains:{{ grains['fqdn_ip4'] }} 变量使用执行模块:{{ salt['network.hw_addr']('eth0') }} 变量使用Pillar:{{ pillar['apache']['PORT'] }} 3

thinkPHP 模板中变量的使用

一.变量输出                1.标量输出(普通)        2.数组输出                {$name[1]}                {$name['k2']}                {$name.k1} $arr = array('a1'=>'和可适当','a2'=>'舒服点');                $this->assign($arr);  //直接传递整个数组不赋值,在模板中直接使用数组的下标作为名字          

【Flask】 Jinja2模板语言

Jinja2 Jinja2是Python Web编程中的主流模板语言.因为flask是基于Jinja2和Werkzeug发展而来,在安装flask的时候jinja2自动就被装在上面了. 之前提到了很多Jinja2的使用方法啊,下面将补充或者更加详细地说明Jinja2作为模板语言的使用. [Jinja2官方文档]http://docs.jinkan.org/docs/jinja2/ ■ 基本语义 看过之前模板的例子就知道,Jinja2做构成的模板文件中,文本内容大致可以分成几个种类.比如特殊文本(

Thinkphp回顾(五)之前台模板中的基本语法

一.导入CSS和JS文件 的三种方式  (了解) 1.link方式(常规) <link rel=’stylesheet’ type=’text/css’ href=’__PUBLIC__/Js/test.css/> <script src='__PUBLIC__/Js/test.js'></script> //导入Public文件夹下面的Js目录中的test.js文件和Css文件夹下的test.css文件 2.import <import type='js' fi

Jinja2模板语言

一,基本使用 flask中默认使用的jinja2模板语言:与django模板语言一样,都是 {{ }} 和 {% %} 1 ,Jinja2模板中的流程控制: Jinja2模板语言中的 for {% for foo in g %} {% endfor %} Jinja2模板语言中的 if {% if g %} {% elif g %} {% else %} {% endif %} 2, 取值方式 字典:可以使用点的方式,还可以使用字典的get("xx"), name["xx&q

ThinkPHP 3.2 模板中的Angularjs 的变量{{$first}} 无法被解析

ThinkPHP 3.2 模板中的Angularjs 的变量"{{$first}}" 无法被解析, 模板解析冲突,例如在angularjs 的变量"{{$first}}",则TP模板不会解析该变量的 <li ng-repeat="(k,v) in data" style="{{$odd?'color:red':''}}"> ID:{{v.user_id}} 用户名:{{v.username}} IP地址:{{v.l

MyEclipse中修改servlet模板

1.在MyEclipse目录下搜索com.genuitec.eclipse.wizards,得到搜索结果 com.genuitec.eclipse.wizards_8.4.100.me200912131330.jar(我的位置是:C:\Users\Administrator\AppData\Local\Genuitec\Common\plugins): 2.备份,复制粘贴一份,完全关闭MyEclipse: 3.使用winrar打开com.genuitec.eclipse.wizards_8.4.