前言
模板是一个包含响应文件的文本,其中包含用占位变量表示的动态成分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。为了渲染模板,Flask使用了一个名为Jinja2的强大模板引擎。
Jinja2模板引擎
1、形式最简单的Jinja2模板就是一个包含响应文本的文件
例1:templates/index.html
<h1>Hello World!</h1>
例2:templates/user.html 包含了一个变量表示的动态部分
<h1>Hello, {{name}}!</h1>
2、渲染模板
默认情况下,Flask在程序文件夹中的templates子文件夹中寻找模板。
在程序实例中,需要用下面的方法,以便渲染这些模板
例3:hello.py:渲染模板
from flask import Flask, render_template
……
# 返回例1的模板
@app.route('/')
def index():
return render_template('index.html')
# 返回例2的模板
@app.route('/user/<name>')
def user(name):
return render_template('user.html', name=name)
render_template函数的第一个函数是模板的文件名,随后的参数都是键值对,表示模板中变量对应的真实值。在这段代码中,第二个模板收到一个名为name的变量。
3、变量
在上面的代码中,使用{{name}}结构表示一个变量,是一个特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取。
Jinja2能识别所有类型的变量,甚至是一些复杂的类型,例如列表、字典和对象。如下:
<p>A value from a dictionary:{{mydict['key']}}.</p>
<p>A value from a list:{{mylist[3]}}.</p>
<p>A value from a list, with a variable index:{{mylist[myintvar]}}.</p>
<p>A value from an object's method:{{myobj.somemethod()}}.</p>
另外,也可以使用过滤器修改变量,过滤器名添加在变量名之后,中间使用竖线分割。例如下面模板以首字母大写形式显示变量name的值:
Hello,{{name|capitalize}}
部分常用过滤器:
过滤器名 | 说明 |
---|---|
safe | 渲染值时不转义 |
capitalize | 把值的首字母转换成大写,其他字母转换成小写 |
lower | 把值转换成小写形式 |
upper | 把值转换成大写形式 |
title | 把值中每个单词的首字母转换成大写 |
trim | 把值的首尾空格去掉 |
striptags | 渲染之前把值中所有的HTML标签都删掉 |
4、控制结构
Jinja2提供了多种控制结构,可用来改变模板的渲染流程。
如条件控制语句:
{% if user %}
Hello,{{user}}!
{% else %)
Hello,Stranger!
{% endif %}
如for循环:
\<ul\>
{% for comment in comments %}
<li>{{comment}}</li>
{% endfor %}
\<\/ul\>
【未完待续】