随着程序内容改变,视图函数也有可能需要变化。模板是一个包含响应文本的文件,其中包含用占位变量表示的动态部分,其具体值只在请求的上下文中才能知道。使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。为了渲染模板,Flask 使用了一个名为 Jinja2 的强大模板引擎。
变量
{{ name }}
结构表示一个变量,它是一种特殊的占位符,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取。Jinja2 能识别所有类型的变量,甚至是一些复杂的类型,例如列表、字典和对象。
可以使用过滤器修改变量,过滤器名添加在变量名之后,中间使用竖线分隔。例如,
{{ name|capitalize }}
(capitalize first letter)。
过滤器名 | 说明 |
---|---|
safe | 渲染值时不转义 |
capitalize | 把值的首字母转换成大写,其他字母转换成小写 |
lower | 把值转换成小写形式 |
upper | 把值转换成大写形式 |
title | 把值中每个单词的首字母都转换成大写 |
trim | 把值的首尾空格去掉 |
striptags | 渲染之前把值中所有的 HTML 标签都删掉 |
控制标记
Jinja中2的控制标记包括:
- 条件判断标记(if/elif/else),
- 循环控制(for-loop)
- macro(宏)
- block (模板继承)
# 条件判断
{% if user %}Hello, {{ user }}!
{% else %}Hello, Stranger!
{% endif %}
# 循环
<ul>{% for comment in comments %}
<li>{{ comment }}</li>{% endfor %}
</ul>
# macro (相当于function)
{% macro render_comment(comment) %}<li>{{ comment }}</li>
{% endmacro %}
<ul>{% for comment in comments %}
{{ render_comment(comment) }}{% endfor %}
</ul>
# 重复使用macro
{% import 'macros.html' as macros %}<ul>
{% for comment in comments %}{{ macros.render_comment(comment) }}
{% endfor %}</ul>
模板继承:
<!-- base.html 基础模板 -->
<html>
<head>
{% if title %}
<title>{{ title }} - microblog</title>
{% else %}
<title>Welcome to microblog</title>
{% endif %}
</head>
<body>
<div>Microblog: <a href="/index">Home</a></div>
<hr>
<!--black中间的内容会被子模板里的内容替代-->
{% block content %}{% endblock %}
</body>
</html>
<!-- index.html 子模板 -->
{% extends "base.html" %}
{% block content %}
<h1>Hi, {{ user.nickname }}!</h1>
{% for post in posts %}
<div><p>{{ post.author.nickname }} says: <b>{{ post.body }}</b></p></div>
{% endfor %}
{% endblock %}
参考资料:
The Flask Mega-Tutorial, Part II: Templates
Jinja2 简明使用手册
《Flask Web开发》