摘要:Web框架的基本介紹;以Flask框架為例創(chuàng)建一個(gè)可登錄的頁面;介紹如何使用MVC模式進(jìn)行Web開發(fā)。
*寫在前面:為了更好的學(xué)習(xí)python,博主記錄下自己的學(xué)習(xí)路程。本學(xué)習(xí)筆記基于廖雪峰的Python教程,如有侵權(quán),請(qǐng)告知?jiǎng)h除。歡迎與博主一起學(xué)習(xí)Pythonヽ( ̄▽ ̄)? *
目錄
Web開發(fā)
Web框架
使用Flask框架
MVC模式
小結(jié)
Web開發(fā)
Web框架
在了解了WSGI之后,我們發(fā)現(xiàn),編寫一個(gè)Web應(yīng)用,其實(shí)就是編寫一個(gè)WSGI的處理函數(shù),針對(duì)每一個(gè)HTTP請(qǐng)求進(jìn)行響應(yīng)。
如果要處理多個(gè)URL,每個(gè)URL又有多個(gè)不同的請(qǐng)求,僅用WSGI接口來處理是很麻煩的。
因此,可以通過Web框架,讓我們專注于一個(gè)函數(shù)來處理一個(gè)URL,而框架的內(nèi)部就是來處理URL到函數(shù)的映射。
常見的Python Web框架有Flask、Django、web.py、Bottle、Tornado。
其中Flask框架是如今比較流行的Web框架,我們以Flask框架為例,簡(jiǎn)單介紹Web框架的使用。
使用Flask框架
我們用Flask框架編寫一個(gè)簡(jiǎn)單的可登錄頁面。
首先通過pip安裝Flask:
pip install flask
然后編寫一個(gè)webapp.py,里面處理三個(gè)URL,分別是:
1.GET/:首頁;
2.GET/signin:登錄頁面,顯示登錄表單;
3.POST/signin:處理登錄表單,顯示登錄結(jié)果。
這里一個(gè)URL/signin分別有GET和POST請(qǐng)求,映射到兩個(gè)處理函數(shù)。
Flask是通過裝飾器在內(nèi)部來把URL與函數(shù)關(guān)聯(lián)起來的,具體代碼如下:
from flask import Flask
from flask import request
webapp = Flask(__name__) # 實(shí)例化一個(gè)Flask應(yīng)用
@webapp.route('/', methods = ['GET', 'POST'] # 添加首頁URL
def home():
return '<h1>Welcome!</h1>'
@webapp.route('/signin', methods = ['GET'] # 添加登錄頁URL,用于GET請(qǐng)求
def signin_form():
return '''<form action="/signin" method="post">
<p><input name="username"></p>
<p><input name="password" type="password"></p>
<p><button type="submit">Sign In</button></p>
</form>'''
@webapp.route('/signin', methods = ['POST']) # 添加登錄頁URL,用于POST請(qǐng)求
def signin():
if request.form['username']=='admin' and request.form['password']=='password':
return '<h3>Hello, admin!</h3>'
return '<h3>Bad username or password</h3>'
if __name__=='__main__':
webapp.run()
相關(guān)代碼解析:
xxx = Flask(__name__),用來實(shí)例化一個(gè)Flask應(yīng)用;
Flask用裝飾器的方法,通過route()函數(shù)來添加URL,傳入的參數(shù)依次為URL,請(qǐng)求方法。
相關(guān)HTML文本解析:
<form>用于創(chuàng)建表單;<p>表示創(chuàng)建一行;<input>用于創(chuàng)建輸入框,其中屬性type="password"表示以密碼形式顯示即*****;<button>用于創(chuàng)建按鈕,其中屬性type="submit"表示可提交。
運(yùn)行webapp.py,可見Flask自帶的Server在端口5000上監(jiān)聽:

在瀏覽器中輸入首頁地址http://localhost:5000/,就能看到我們編寫的首頁內(nèi)容:
然后輸入http://localhost:5000/signin,可以看到登錄表單:

輸入剛剛我們編寫的用戶名和密碼,可以看到登錄結(jié)果:

如果用戶名或密碼輸入錯(cuò)誤,則會(huì)顯示登錄錯(cuò)誤:
當(dāng)然了,實(shí)際的Web應(yīng)用是要通過數(shù)據(jù)庫來對(duì)比用戶名和密碼,判斷用戶是否能登錄成功。
MVC模式
WSGI讓我們只專注于編寫處理函數(shù),針對(duì)每個(gè)HTTP請(qǐng)求進(jìn)行響應(yīng)就能編寫出Web應(yīng)用。
而Web框架的使用,讓我們只要專注于編寫每個(gè)URL對(duì)應(yīng)的處理函數(shù)即可,簡(jiǎn)化了Web應(yīng)用的開發(fā)過程。
然而,僅僅這樣還是不夠,因?yàn)橐粋€(gè)基本的網(wǎng)頁一般都會(huì)有幾千行的HTML,如果想要在Python中以字符串來編寫出這么多的HTML是不現(xiàn)實(shí)的。
所以,更好的處理方式是準(zhǔn)備好HTML文檔作為模板,要使用時(shí)在Python中調(diào)用,并傳入具體的數(shù)據(jù),形成最終的HTML發(fā)送給用戶。
這種模式就是MVC模式——Model-View-Controller。
Model,模型,負(fù)責(zé)接收具體數(shù)據(jù)并傳遞給View;
View,視圖,負(fù)責(zé)顯示邏輯,在這里就是HTML模板部分,經(jīng)過簡(jiǎn)單的替換后就可以展示給用戶;
Controller,控制器,負(fù)責(zé)業(yè)務(wù)邏輯,Python處理URL的函數(shù)就是Controller。
我們用MVC模式再編寫一個(gè)簡(jiǎn)單的登錄頁面。
在編寫之前,我們需要先安裝一種模板,Python的模板有很多種,F(xiàn)lask默認(rèn)支持的模板是jinja2,所以我們先安裝jinja2:
pip install jinja2
然后,我們編寫MVC中的Model和Controller部分:
from flask import Flask
from flask import request
from flask import render_template
webapp = Flask(__name__)
@webapp.route('/', methods = ['GET', 'POST'])
def home():
return render_template('home.html') # 返回首頁
@webapp.route('/signin', methods = ['GET'])
def signin_form():
return render_template('form.html') # 返回表單的頁面
@webapp.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) # 返回登錄成功的頁面,并傳入username數(shù)據(jù)
return render_template('form.html', message='Bad username or password', username=username)
if __name__=='__main__':
webapp.run()
Flask通過render_template()函數(shù)來實(shí)現(xiàn)模板的渲染。
接下來編寫MVC的View部分,即三個(gè)HTML:
首頁,home.html:
<html>
<head>
<title>Home</title>
</head>
<body>
<h1 style="font-style:italic">Home</h1>
</body>
</html>
登錄頁面,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>
登錄成功頁面,signin_ok.html:
<html>
<head>
<title>Welcome, {{ username }}</title>
</head>
<body>
<p>Welcome, {{ username }}!</p>
</body>
</html>
登錄失敗的頁面通過條件判斷語句加在了form.html里面。
在jinja2模板中,用{% ... %}表示指令,比如上面的if指令:{% if message %}。用{{ name }}表示需要替換的變量。
下面是登錄失敗時(shí)的顯示頁面:

除了jinja2模板,常見的模板還有:
Mako:用<% ... %>和${xxx}的一個(gè)模板;
Cheetah:也是用<% ... %>和${xxx}的一個(gè)模板;
Django:Django是一站式框架,內(nèi)置一個(gè)用{% ... %}和{{ xxx }}的模板。
小結(jié)
有了Web框架,我們編寫Web應(yīng)用時(shí),專注于URL與對(duì)應(yīng)的處理函數(shù)即可,相比用WSGI簡(jiǎn)單很多;
而通過MVC模式,我們?cè)赑ython代碼中處理Model和Controller部分,在HTML代碼中處理View部分。這樣就可以把Python代碼和HTML代碼分開,便于修改與調(diào)試。
以上就是本節(jié)的全部?jī)?nèi)容,感謝你的閱讀。
下一節(jié)內(nèi)容:異步IO之 協(xié)程
有任何問題與想法,歡迎評(píng)論與吐槽。
和博主一起學(xué)習(xí)Python吧( ̄▽ ̄)~*