python学习笔记-Day17(jinja2)

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")






你可能感兴趣的:(python,jinja2)