前言

模板是一个包含响应文件的文本,其中包含用占位变量表示的动态成分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。为了渲染模板,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\>

【未完待续】

最后修改:2020 年 01 月 25 日
如果觉得我的文章对你有用,请随意赞赏