# 这是学习廖雪峰老师python教程的学习笔记
Web App不仅仅是处理逻辑,展示给用户的页面也非常重要。在函数中返回一个包含HTML的字符串,简单的页面还可以,复杂的页面就无法做到。由于在Python代码里拼字符串是不现实的,所以,模板技术出现了
1、模板的使用流程
使用模板,我们需要预先准备一个HTML文档,这个HTML文档不是普通的HTML,而是嵌入了一些变量和指令,然后,根据我们传入的数据,替换后,得到最终的HTML,发送给用户
2、MVC
上图的整个流程,就是MVC:Model-View-Controller,中文名“模型-视图-控制器”。
1、模型
Model是用来传给View的,这样View在替换变量的时候,就可以从Model中取出相应的数据。上面图的Model就是一个dict:{ 'name': 'Michael' }。
因为Python支持关键字参数,很多Web框架允许传入关键字参数,然后,在框架内部组装出一个dict作为Model。
2、视图
包含{ { name }}的模板就是View,View负责显示逻辑,通过简单地替换一些变量,View最终输出的就是用户看到的HTML。上图的view就是模板
3、控制器
Python处理URL的函数就是Controller,Controller负责业务逻辑,比如检查用户名是否存在,取出用户信息等等。上图的控制器就是app.py
3、改造上一节的例子
把上次直接输出字符串作为HTML的例子用MVC模式改写一下
1、编写控制器
from flask import Flask, request, render_template
app = Flask(__name__)
@app.route('/', methods=['GET', 'POST'])
def home():
return render_template('home.html') # Flask通过render_template()函数来实现模板的渲染
@app.route('/signin', methods=['GET'])
def signin_form():
return render_template('form.html')
@app.route('/signin', methods=['POST'])
def signin():
username = request.form['username']
password = request.form['password']
if username=='admin' and password=='password':
return render_template('signin-ok.html', username=username)
# 登录失败的模板也是form.html
return render_template('form.html', message='Bad username or password', username=username)
if __name__ == '__main__':
app.run()
和Web框架类似,Python的模板也有很多种。Flask默认支持的模板是jinja2
2、首页模板home.html
<html>
<head>
<title>Home</title>
</head>
<body>
<h1 style="font-style:italic">Home</h1>
</body>
</html>
3、登录表单的模板form.html
<html>
<head>
<title>Please Sign In</title>
</head>
<body>
{% if message %}
<p style="color:red">{
{ message }}</p>{% endif %}
<form action="/signin" method="post">
<legend>Please sign in:</legend>
<p><input name="username" placeholder="Username" value="{
{ username }}"></p><p><input name="password" placeholder="Password" type="password"></p>
<p><button type="submit">Sign In</button></p>
</form>
</body>
</html>
4、登录成功的模板signin-ok.html
<html>
<head>
<title>Welcome, {
{ username }}</title></head>
<body>
<p>Welcome, {
{ username }}!</p></body>
</html>
5、把模板放到正确的templates目录下,templates和app.py在同级目录下
6、Jinja2模板
在Jinja2模板中,我们用{
{ name }}表示一个需要替换的变量。很多时候,还需要循环、条件判断等指令语句,在Jinja2中,用{% ... %}表示指令循环输出页码:
{% for i in page_list %}
<a href="/page/{ { i }}">{ { i }}</a>
{% endfor %}
7、其他常见模板
:用<% ... %>和${xxx}的一个模板;
:也是用<% ... %>和${xxx}的一个模板;
:Django是一站式框架,内置一个用{% ... %}和{ { xxx }}的模板。