jinja2 是一个python的功能齐全的模板引擎,它有完整的unicode支持,一个可选的集成沙箱执行环境。它速度快,被广泛使用。使用jinja2 至少需要python2.4
特性
沙箱中执行
强大的HTML自动转义系统,保护系统免受跨站脚本攻击(xss)
模板继承
及时编译最优的python代码
可选提前编译模板的时间
易于调试,异常的的行数直接指向模板中对应的行
可配置的语法
安装
tar文件安装
tar fielname.tar.gz
进入解压后的文件目录
然后sudo python setup.py install
pip 安装
sudo pip install jinja2
开发版安装
git clone git://github.com/mitsuhiko/jinja2.git
cd jinja2
ln -s jinja2 /usr/lib/python2.X/site-packages
使用方法
>>> from jinja2 import Template
>>> template = Template('Hello {{ name }}!')
>>> template.render(name='John Doe')
u'Hello John Doe!'
另外一个示例
cat func.py
#!/usr/bin/env python # -*- coding:utf-8 -*- from jinja2 import Template def index(): f = open('index.html') result = f.read() template = Template(result) data = template.render(name='John Doe', user_list=['alex', 'eric']) return data.encode('utf-8') newData = index() print newData
注意 #jinja2 默认返回的字符串的编码格式为unicode 需要转换为utf8后使用
cat index.html
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <h1>{{name}}</h1> <ul> {% for item in user_list %} <li>{{item}}</li> {% endfor %} </ul> </body> </html>
python func.py
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <h1>John Doe</h1> <ul> <li>alex</li> <li>eric</li> </ul> </body> </html>
使用模板引擎可以使用for if/else 等流程控制语句 ,依照模板引擎的语法规则,其内部会对特定的语法进行替换.
一个例子
web/templates/master/m1.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> <link rel="stylesheet" href="/static/css/comm.css"/> {% block css %}{% endblock %} #一般这里定义css文件 </head> <body> <div class="header">Top</div> <div class="body"> <div class="left">MENU</div> <div class="content"> {% block content %} # 其他文件在导入m1.html的时候 会替换这里的内容 , 本例中的/son1.html 的 {% block content %} 会替换这里的内容 {% endblock %} </div> </div> {% block js %}{% endblock %} #一般这里定义js文件 </body> </html>
web/templates/include/include1.html
<h1>Include</h1> <input type="text"> <input type="text">
web/templates/home.html
{% load customDef %} #这里使用了 自定义标签,对应customDef.py ; customDef 为文件名 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <h1>What is your name?</h1> <h1>{{name}}</h1> <h1>{{age}}</h1> {% for item in user_list %} #开始循环 <h3>item</h3> 循环的每一项 {% endfor %} 结束循环 {% myTag01 1 2 %} #这里使用了 自定义标签,对应customDef.py </body> </html>
web/templates/son1.html
{% extends "master/m1.html" %} # extends 只用一次 其他的使用include 导入文件;master/m1.html 为模板文件, son1.html 的内容会继承模板文件的内容 {% block content %} this is a son page! {% include "include/include1.html" %} #include 导入文件 {% endblock %}
web/app01/templatetags/customDef.py
#!/usr/bin/env python # -*- coding:utf-8 -*- from django import template from django.utils.safestring import mark_safe from django.template.base import resolve_variable,Node,TemplateSyntaxError register = template.Library() @register.simple_tag() def myTag01(v1,v2): #自定义标签的处理方式 return v1+v2
web/app01/views.py
#!/usr/bin/env python # -*- coding:utf-8 -*- # Create your views here. from django.shortcuts import HttpResponse from django.shortcuts import render def home(request): # return HttpResponse("ok") dic = {"name":"allen","age":12} return render(request,"home.html",dic) def son(request): return render(request,"son1.html")