摘要:Web框架的基本介紹;以Flask框架為例創建一個可登錄的頁面;介紹如何使用MVC模式進行Web開發。
*寫在前面:為了更好的學習python,博主記錄下自己的學習路程。本學習筆記基于廖雪峰的Python教程,如有侵權,請告知刪除。歡迎與博主一起學習Pythonヽ( ̄▽ ̄)? *
目錄
Web開發
Web框架
使用Flask框架
MVC模式
小結
Web開發
Web框架
在了解了WSGI之后,我們發現,編寫一個Web應用,其實就是編寫一個WSGI的處理函數,針對每一個HTTP請求進行響應。
如果要處理多個URL,每個URL又有多個不同的請求,僅用WSGI接口來處理是很麻煩的。
因此,可以通過Web框架,讓我們專注于一個函數來處理一個URL,而框架的內部就是來處理URL到函數的映射。
常見的Python Web框架有Flask、Django、web.py、Bottle、Tornado。
其中Flask框架是如今比較流行的Web框架,我們以Flask框架為例,簡單介紹Web框架的使用。
使用Flask框架
我們用Flask框架編寫一個簡單的可登錄頁面。
首先通過pip安裝Flask:
pip install flask
然后編寫一個webapp.py
,里面處理三個URL,分別是:
1.GET/
:首頁;
2.GET/signin
:登錄頁面,顯示登錄表單;
3.POST/signin
:處理登錄表單,顯示登錄結果。
這里一個URL/signin
分別有GET和POST請求,映射到兩個處理函數。
Flask是通過裝飾器在內部來把URL與函數關聯起來的,具體代碼如下:
from flask import Flask
from flask import request
webapp = Flask(__name__) # 實例化一個Flask應用
@webapp.route('/', methods = ['GET', 'POST'] # 添加首頁URL
def home():
return '<h1>Welcome!</h1>'
@webapp.route('/signin', methods = ['GET'] # 添加登錄頁URL,用于GET請求
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請求
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()
相關代碼解析:
xxx = Flask(__name__)
,用來實例化一個Flask應用;
Flask用裝飾器的方法,通過route()
函數來添加URL,傳入的參數依次為URL,請求方法。
相關HTML文本解析:
<form>
用于創建表單;<p>
表示創建一行;<input>
用于創建輸入框,其中屬性type="password"
表示以密碼形式顯示即*****
;<button>
用于創建按鈕,其中屬性type="submit"
表示可提交。
運行webapp.py
,可見Flask自帶的Server在端口5000上監聽:
在瀏覽器中輸入首頁地址http://localhost:5000/
,就能看到我們編寫的首頁內容:
然后輸入http://localhost:5000/signin,可以看到登錄表單:
輸入剛剛我們編寫的用戶名和密碼,可以看到登錄結果:
如果用戶名或密碼輸入錯誤,則會顯示登錄錯誤:
當然了,實際的Web應用是要通過數據庫來對比用戶名和密碼,判斷用戶是否能登錄成功。
MVC模式
WSGI讓我們只專注于編寫處理函數,針對每個HTTP請求進行響應就能編寫出Web應用。
而Web框架的使用,讓我們只要專注于編寫每個URL對應的處理函數即可,簡化了Web應用的開發過程。
然而,僅僅這樣還是不夠,因為一個基本的網頁一般都會有幾千行的HTML,如果想要在Python中以字符串來編寫出這么多的HTML是不現實的。
所以,更好的處理方式是準備好HTML文檔作為模板,要使用時在Python中調用,并傳入具體的數據,形成最終的HTML發送給用戶。
這種模式就是MVC模式——Model-View-Controller。
Model,模型,負責接收具體數據并傳遞給View;
View,視圖,負責顯示邏輯,在這里就是HTML模板部分,經過簡單的替換后就可以展示給用戶;
Controller,控制器,負責業務邏輯,Python處理URL的函數就是Controller。
我們用MVC模式再編寫一個簡單的登錄頁面。
在編寫之前,我們需要先安裝一種模板,Python的模板有很多種,Flask默認支持的模板是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數據
return render_template('form.html', message='Bad username or password', username=username)
if __name__=='__main__':
webapp.run()
Flask通過render_template()
函數來實現模板的渲染。
接下來編寫MVC的View部分,即三個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 }}
表示需要替換的變量。
下面是登錄失敗時的顯示頁面:
除了jinja2模板,常見的模板還有:
Mako:用<% ... %>
和${xxx}
的一個模板;
Cheetah:也是用<% ... %>
和${xxx}
的一個模板;
Django:Django是一站式框架,內置一個用{% ... %}
和{{ xxx }}
的模板。
小結
有了Web框架,我們編寫Web應用時,專注于URL與對應的處理函數即可,相比用WSGI簡單很多;
而通過MVC模式,我們在Python代碼中處理Model和Controller部分,在HTML代碼中處理View部分。這樣就可以把Python代碼和HTML代碼分開,便于修改與調試。
以上就是本節的全部內容,感謝你的閱讀。
下一節內容:異步IO之 協程
有任何問題與想法,歡迎評論與吐槽。
和博主一起學習Python吧( ̄▽ ̄)~*