文档章节

修改jinja2模板中变量标识符

yongqing
 yongqing
发布于 2014/08/27 14:48
字数 334
阅读 2661
收藏 0


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






© 著作权归作者所有

yongqing
粉丝 1
博文 14
码字总数 4919
作品 0
昆明
程序员
私信 提问
ansible filter_plugins插件实现jinja2自定义filter过滤器

前言: filterplugins是什么? 这个单词拆解下,filter ! 熟悉jinja2模板的人,到知道他是过滤器,可以在模板中以管道的方式用pyhton的代码处理字符串。 ansible模板调用的是jinja2,这个大...

rfyiamcool
2014/07/21
0
0
Flask实例教程八

Flask本身是需要依靠Jinja2。其模板引擎也采用的是Jinja2。 本博文重点介绍一下Jinja2模板引擎的基本使用。 一:模板的基本使用 app.pyfrom flask import Flaskfrom flask import render_temp...

Jeff_Linux
2014/06/06
0
0
SaltStack实战之配置管理-Jinja2模板

SaltStack实战之配置管理-Jinja2模板 SaltStack实战之配置管理-Jinja2模板 1. Salt yaml配置文件使用Jinja2模板介绍 2. 实战应用 1. Salt yaml配置文件使用Jinja2模板介绍 jinja2官方网站: ...

ygqygq2
2017/06/16
0
0
jinja2 基础学习笔记

一.变量和过滤器1.变量引用在模板中使用的 {{ name }} 结构表示一个变量,它是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取。Jinja2 能识别所有类型的变量,甚至是...

Travler
2016/10/14
71
0
Flask学习笔记之模板(一)

大纲 之前的视图函数返回的都是字符串,这样是很不利于网站建设,大家都知道,我们都网页构造三大元素(html,css,js),那这些数据如何通过视图函数返回了?答案就是templates文件。 模板基...

罗罗攀
2018/11/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

安全组和云防火墙的区别

前言 熟悉云平台的朋友可能都会注意到这样一个事情:无论公有云还是私有云,创建虚拟机的时候都需要选择安全组,来对虚拟机进行安全防护;有的云平台在VPC里,还能选择防火墙,ZStack在3.6版...

ZStack社区版
26分钟前
2
0
教育性app开发的重要性和好处

在这个精通技术的世界中,流行的app主导着无聊的教育系统。当我们将技术和教育结合在一起时,它将带来当代以及强大的学习资源。因此,将教育移动app集成到您的学习过程中,并根据自己的信念把...

a429011717
27分钟前
3
0
IE6/7/8如何兼容CSS3属性

本文转载于:专业的前端网站➩IE6/7/8如何兼容CSS3属性 最近在工作中总是要求IE8兼容CSS3属性,在网上搜了搜主要是引入了一个htc文件(ie-css3.htc或者PIE.htc。个人认为这两个文件的作用差不...

前端老手
42分钟前
3
0
手把手教你ALLEGRO的约束规则的设置教程!

约束规则的设置 分三步, 定义规则(一、基本约束规则设置:1、线间距设置;2、线宽设置;3、设置过孔;4、区域约束规则设置;5、设置阻抗;6、设置走线的长度范围;7、设置等长:7.1、不过电阻的NET 等...

demyar
44分钟前
4
0
完美解决H5滚动滑动穿透方案:不使用系统滚动

网上有很多黑科技解决这个问题,都不是从根本去解决,例如通过js控制弹出时html加上position:fixed; 弹窗关闭后再去掉该样式,总觉得不太对,像是打补丁。 今天终于找到了滚动穿透的原因和完...

未来cc
48分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部