Jinja2 相关
jinja2 是 Flask 作者开发的一个模板系统
一、安装
1、安装jinja2
pip install jinja2
2、测试是否安装成功
python -c "import jinja2"
二、基本语法
- 控制结构
 {% %}
- 变量取值
 {{ }}
- 注释
 {# #}
例子:
{# This is jinja code
    {% for file in filenames %}
    ...
    {% endfor %}
#}
可以看到,for循环的使用方式和Python比较类似,但是没有了句尾的冒号,另外需要使用endfor最为结尾,其实在jinja2中,if也是一样的,结尾需要使用endif。
1、变量
<p>this is a dicectory:{{ mydict['key'] }} </p>
<p>this is a list:{{ mylist[3] }} </p>
<p>this is a object:{{ myobject.something() }} </p>
2、过滤器
变量可以通过“过滤器”进行修改,过滤器可以理解为是jinja2里面的内置函数和字符串处理函数。
| 常用过滤器 | 说明 | 
|---|---|
| safe | 渲染时值不转义 | 
| capitialize | 把值的首字母转换成大写,其他子母转换为小写 | 
| lower | 把值转换成小写形式 | 
| upper | 把值转换成大写形式 | 
| title | 把值中每个单词的首字母都转换成大写 | 
| trim | 把值的首尾空格去掉 | 
| striptags | 渲染之前把值中所有的HTML标签都删掉 | 
| join | 拼接多个值为字符串 | 
| replace | 替换字符串的值 | 
| round | 默认对数字进行四舍五入,也可以用参数进行控制 | 
| int | 把值转换成整型 | 
{{ 'abc' | captialize  }}
# Abc
{{ 'abc' | upper  }}
# ABC
{{ 'hello world' | title  }}
# Hello World
{{ "hello world" | replace('world','daxin') | upper }}
# HELLO DAXIN
{{ 18.18 | round | int }}
# 18
3、控制结构
{% if daxin.safe %}
daxin is safe.
{% elif daxin.dead %}
daxin is dead
{% else %}
daxin is okay
{% endif %}
4、for 循环
<title>{% block title %}{% endblock %}</title>
<ul>
{% for user in users %}
  <li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>
循环生成
<ul>
    {% for user in users %}
    <li>{{ user.username|title }}</li>
    {% endfor %}
</ul>
迭代字典
<dl>
    {% for key, value in my_dict.iteritems() %}
    <dt>{{ key }}</dt>
    <dd>{{ value}}</dd>
    {% endfor %}
</dl>
在for循环中,jinja2还提供了一些特殊的变量,用以来获取当前的遍历状态
| 变量 | 描述 | 
|---|---|
| loop.index | 当前迭代的索引(从1开始) | 
| loop.index0 | 当前迭代的索引(从0开始) | 
| loop.first | 是否是第一次迭代,返回bool | 
| loop.last | 是否是最后一次迭代,返回bool | 
| loop.length | 序列中的项目数量 | 
| loop.revindex | 到循环结束的次数(从1开始) | 
| loop.revindex0 | 到循环结束的次数(从0开始) | 
5、继承和super函数
base.html
<!DOCTYPE html>
<html lang="en">
<head>
    {% block head %}
    <link rel="stylesheet" href="style.css"/>
    <title>{% block title %}{% endblock %} - My Webpage</title>
    {% endblock %}
</head>
<body>
<div id="content">{% block content %}{% endblock %}</div>
<div id="footer">
    {% block  footer %}
    <script>This is javascript code </script>
    {% endblock %}
</div>
</body>
</html>
使用继承, 这里定义了四处 block,即:head,title,content,footer。那怎么进行继承和变量替换呢?注意看下面的文件
{% extend "base.html" %}       # 继承base.html文件
{% block title %} Dachenzi {% endblock %}   # 定制title部分的内容
{% block head %}
    {{  super()  }}        # 用于获取原有的信息
    <style type='text/css'>
    .important { color: #FFFFFF }
    </style>
{% endblock %}   
# 其他不修改的原封不动的继承
三、基本使用方法
>>> from jinja2 import Template
>>> template = Template('Hello {{ name }}!')
>>> template.render(name='John Doe')
u'Hello John Doe!'
大多数应用都在初始化的时候撞见一个Environment对象,并用它加载模板。Environment支持两种加载方式:
- PackageLoader:包加载器 
- FileSystemLoader:文件系统加载器 
from jinja2 import PackageLoader,Environment
env = Environment(loader=PackageLoader('python_project','templates')) # 创建一个包加载器对象
template = env.get_template('bast.html')    # 获取一个模板文件
template.render(name='daxin',age=18)   # 渲染
- PackageLoader()的两个参数为:python包的名称,以及模板目录名称。
- get_template():获取模板目录下的某个具体文件。
- render():接受变量,对模板进行渲染