1.从视图函数说起
视图函数就是用来生成请求的响应。这个响应过程分为业务逻辑和表现逻辑。业务逻辑简单理解就是对用户请求的处理,表现逻辑简单理解就是把处理结果回送给浏览器。
2.为什么需要模板
模板就是一个包含响应文本的文件。从字面意思理解就是它里面包含视图函数功能的代码,同时内部结构具有一定的规范性。有了模板我们可以把表现逻辑移到模板中,这样可以提升程序的可维护性。
3.渲染模板
使用真实值替换变量,再返回最终得到的响应字符串,这一过程称为渲染。Jinja2模板引擎是为了能够渲染模板而存在的。
from flask import Flask, render_template #Flask提供的render_template函数把Jinja2集成到程序中
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html') #index.html是模板文件名
@app.route('/user/<name>')
def user(name):
return render_template('user.html', name=name) #user.html是模板文件名,name=name是键值对,左边是参数名,右边是值
4.变量
<h1>Hello,{{ name }}!</h1> <!--模板中使用{{ name }}表示一个变量,告诉模板引擎这个位置的值从渲染模板时使用的数据中获取-->
Jinja2能识别所有类型的变量,包括字典{{ mydict['key'] }}、列表{{ mylist[3] }}、下标为变量的列表{{ mydict[index] }}、
对象{{ myobj.somemethod() }}。
当我们对变量的格式有特定要求时,我们可以通过过滤器来修改变量。我对过滤器的理解类似于滤镜,白光通过特定颜色的滤镜最终显示为和滤镜同色的颜色。当变量经过特定过滤器修改后,它的格式符合这种过滤器的格式。
Hello, {{ name|capitalize }} <!--过滤器使用格式,该例中以首字母大写形式显示变量name-->
5.控制结构
当我们在用模板返回响应时,我们要根据请求包涵的条件,返回相应内容。因此模板本身就要对所要返回的内容进行控制。
{% if user %} <!--条件控制语句-->
Hello,{{ user }}!
{% else %}
Hello,stranger!
{% endif %} <!--控制语句有结束语-->
<!----------------------------------------分隔线------------------------------------------->
<ul> <!--for循环语句-->
{% fot comment in comments %}
<li>{{ comment }}</li>
{% endfor %}
</ul> <!--可以看出控制语句都在{% *** %}里-->
<!----------------------------------------分隔线------------------------------------------->
{% macro render_comment(comment) %} <!--定义一个宏,其作用是对comment进行处理-->
<li>{{ comment }}</li>
{% endmacro %}
<ul>
{% for comment in comments %} <!--调用上面那个宏,实现对comment的处理-->
{{ render_comment(comment)}}
{% endfor %}
</ul>
<!----------------------------------------分隔线------------------------------------------->
{% import 'macros.html' as macros %} <!--把宏单独写在一个文件里,对其重复使用-->
<ul>
{% for comment in comments %}
{{ macros.render_comment(comment)}} <!--宏跟for语句不在一个文件中的写法-->
{% endfor %}
</ul>
6.模板继承
模板继承是一种重复使用代码的方法。首先要有一个基模板,继承这个基模板的模板称为衍生模板。
<!--基模板-->
<html>
<head>
{% block head %} <!--block标签定义的元素可在衍生模板中修改-->
<title>{% block title %}{% endblock %} - My Application</title>
{% endblock %}
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
<!--衍生模板-->
{% extends "base.html" %}
{% block title %}Index{% endblock %} <!--替换的内容-->
{% block head %}
{{ super() }}
<style>
</style>
{% endblock %}
{% block body %}
<h1>Hello,World!</h1> <!--替换的内容只要用block体标识出来即可-->
{% endblock %}