但是Web App不僅僅是處理邏輯,展現給用戶的頁面也很重要。返回函數中包含HTML的字符串。壹個簡單的頁面還可以,但是考慮到新浪首頁6000多行HTML,妳確定用Python的string能寫對嗎?反正我做不到。
俗話說,不懂前端的Python工程師不是好的產品經理。有Web開發經驗的同學都知道,Web App最復雜的部分就是HTML頁面。HTML不僅要正確,還要通過CSS和復雜的JavaScript腳本來美化,實現各種交互和動畫效果。簡而言之,生成HTML頁面非常困難。
因為用Python代碼拼寫字符串不現實,模板技術就出現了。
使用模板,我們需要預先準備壹個HTML文檔。這個HTML文檔不是普通的HTML,而是嵌入了壹些變量和指令。然後根據我們傳入的數據,經過替換,得到最終的HTML並發送給用戶:
這就是傳說中的MVC:模型-視圖-控制器,中文名字叫“模型-視圖-控制器”。
Python處理URL的函數是C: Controller,負責業務邏輯,比如檢查用戶名是否存在,取出用戶信息。
包含變量{{ name }}的模板是V: View,負責顯示邏輯。通過簡單地替換壹些變量,View的最終輸出就是用戶看到的HTML。
MVC中的模型在哪裏?模型用來傳遞給視圖,這樣當視圖替換變量時,就可以從模型中檢索相應的數據。
在上面的例子中,模型是壹個字典:
{姓名:邁克爾}
正因為Python支持關鍵字參數,所以很多Web框架都允許妳傳入關鍵字參數,然後在框架內部組裝壹個dict作為模型。
現在,我們以最後壹個直接輸出的字符串作為HTML的例子,用高端大氣上檔次的MVC模式重寫:
16
17
18
19
20
21
22
從燒瓶導入燒瓶,請求,渲染_模板
app = Flask(__name__)
@app.route(/,methods=[GET,POST])
def home():
返回render_template(home.html)
@app.route(/signin,methods=[GET])
定義登錄表單():
返回render_template(form.html)
@app.route(/signin,methods=[POST])
定義登錄():
用戶名= request . form[用戶名]
password = request . form[password]
如果用戶名= =管理員,密碼= =密碼:
返回render_template(signin-ok.html,username=username)
返回render_template(form.html,message =錯誤的用戶名或密碼,username =用戶名)
if _ _ name _ _ = = _ _ main _ _:
app.run()
Flask通過render_template()函數實現模板渲染。與Web框架類似,Python模板也有很多種。Flask默認支持的模板是jinja2,我們先直接安裝jinja2:
1
$ easy_install jinja2
然後,開始編寫jinja2模板:
1
home.html
用於顯示主頁的模板:
11
超文本標記語言
頭
標題主頁/標題
/頭
身體
h 1 style = font-style:italic home/h 1
/body
/html
form.html
用於顯示登錄表單的模板:
16
17
18
超文本標記語言
頭
title請登錄/title
/頭
身體
{% if消息%}
p style=color:red{{ message }}/p
{% endif %}
表單操作=/登錄方法=發布
legend請登錄:/legend
pinput name =用戶名placeholder =用戶名value={{用戶名}}/p
p輸入名稱=密碼占位符=密碼類型=密碼/p
p按鈕類型=提交登錄/按鈕/p
/表單
/body
/html
signin-ok.html
成功登錄的模板:
七
八
超文本標記語言
頭
title歡迎,{{用戶名}}/title
/頭
身體
歡迎光臨,{{用戶名}}!/p
/body
/html
登錄失敗的模板怎麽辦?我們給form.html添加了壹點條件判斷,並重用form.html作為登錄失敗的模板。
最後,確保將模板放在正確的模板目錄中。templates和app.py在同壹個目錄中:
使用模板啟動python app.py查看頁面效果:
通過MVC,我們在Python代碼中處理M: model和C: controller,而V: view是通過模板處理的,所以我們最大程度上成功地將Python代碼和HTML代碼分離開來。
使用模板的另壹個好處是容易修改,保存後刷新瀏覽器就能看到最新的效果,這對調試HTML、CSS、JavaScript的前端工程師來說真的很重要。
在Jinja2模板中,我們使用{{ name }}來表示需要替換的變量。很多時候需要循環、條件判斷等指令語句。在Jinja2中,指令用{%表示...%}.
例如,循環輸出頁碼:
1
2
三
{% for i in page_list %}
a href=/page/{{ i }}{{ i }}/a
{% endfor %}
如果page_list是壹個列表:[1,2,3,4,5],上面的模板會輸出5個超鏈接。
除了Jinja2,常見的模板還包括:
櫻井真子:使用帶有${xxx}的模板;
獵豹:也是帶有${xxx}的模板;
Django:Django是壹個壹站式框架,帶有壹個帶有{%的模板...%}和{{ xxx }}。
總結
使用MVC,我們將Python代碼與HTML代碼分開。HTML代碼全部放在模板裏,寫起來效率更高。