# 這是學習廖雪峯老師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、其他常見模板
Mako:用<% ... %>和${xxx}的一個模板;
Cheetah:也是用<% ... %>和${xxx}的一個模板;
Django:Django是一站式框架,內置一個用{% ... %}和{{ xxx }}的模板。