上篇文章我們學(xué)習(xí)了Flask框架——項目可安裝化,這篇文章我們學(xué)習(xí)Flask框架——基于類的視圖昧狮。
基于類的視圖有兩種:繼承View的類視圖和繼承MethodView的類視圖景馁。
基于類的視圖是以類的方式實現(xiàn)視圖函數(shù)的邏輯,封裝視圖函數(shù)逗鸣,能夠比較優(yōu)雅的方式實現(xiàn)很多復(fù)雜的不同功能合住。
例如:類的方法視圖函數(shù)封裝了處理get、post請求的函數(shù)撒璧,當請求方法為get就調(diào)用類中的get請求函數(shù)透葛,當請求方法為post請求時,就調(diào)用類中的post請求函數(shù)卿樱。
這樣根據(jù)請求方法來和類中的函數(shù)形成一個綁定關(guān)系僚害,從而達到映射的效果。
基于類的視圖好處:
- 類是可以繼承的繁调,我們可以編寫一個基礎(chǔ)的類視圖來繼承特定功能的類視圖萨蚕,實現(xiàn)代碼復(fù)用;
- 可以定義多種函數(shù)實現(xiàn)多個功能蹄胰,邏輯清晰岳遥。
例如:Flask程序使用傳統(tǒng)的視圖函數(shù),示例代碼如下:
from flask import Flask, request
app=Flask(__name__)
@app.route("/index/<index_id>", methods=["GET", "POST", "PUT", "DELETE"])
def index(index_id):
method = request.method
if method == "GET":
if user_id is None:
.....
return f"get {index_id}"
elif method == "post":
.....
return f"post {index_id}"
elif method=='PUT':
.....
return '......'
....
return "其他的方法判斷"
if __name__ == '__main__':
app.run(debug=True)
在傳統(tǒng)的視圖函數(shù)中裕寨,我們通常會在視圖函數(shù)中添加很多if判斷來滿足不同的請求類型寒随,如果判斷的代碼有很多,那么在一個視圖函數(shù)中就顯得很臃腫帮坚,不利于我們后期進行維護妻往。
這時我們可以使用基于類的視圖函數(shù)——繼承View的類視圖。
繼承View的類視圖
Flask示例代碼如下:
from flask.views import View
from flask import Flask, request
class index(View): #創(chuàng)建index類繼承View
methods = ["GET", "POST"] #該類接收的請求類型
def get(self): #get請求
return "get"
def post(self): #post請求
return "post"
def dispatch_request(self): #重寫dispatch_request方法
request_method = {"get": self.get, "post": self.post} #請求類型和請求方法綁定
view = request_method.get(request.method.lower()) #通過請求方法试和,映射到對應(yīng)的函數(shù)對象
return view() #返回view值
app = Flask(__name__)
app.add_url_rule("/index", view_func=index.as_view("index")) #注冊視圖函數(shù)
if __name__ == '__main__':
app.run(debug=True)
首先我們創(chuàng)建名為index的類讯泣,添加請求類型并為每種請求類型添加函數(shù),重寫dispatch_request()方法來為請求類型和請求方法進行綁定阅悍,這樣當我們接收不同類型的請求就可以調(diào)用對應(yīng)的請求方法好渠,最后通過app.add_url_rule()方法來注冊視圖函數(shù)昨稼,其中第一個參數(shù)為URL,第二個參數(shù)是視圖函數(shù)名拳锚,需要使用as_view()方法把類轉(zhuǎn)換為實際的視圖函數(shù)假栓,上面的視圖函數(shù)名為index。
注意:
- 基于類的視圖函數(shù)要基礎(chǔ)View霍掺;
- 必須重寫dispatch_request方法匾荆,主要實現(xiàn)請求調(diào)度的作用;
- 請求類型可以放在類的methods屬性里面杆烁;
- 基于類的視圖不能用@app.route裝飾器來注冊路由牙丽,只能用add_url_rule方法綁定視圖。
繼承View的類視圖核心是基于dispatch_request方法調(diào)度的兔魂。
繼承MethodView的類視圖
對比傳統(tǒng)的視圖函數(shù)和繼承View的類視圖烤芦,繼承View的類視圖雖然邏輯比較清晰了,但代碼更多了析校,這主要是繼承View的類視圖需要重寫dispatch_request()方法构罗,這時我們可以使用繼承MethodView的類視圖,它里面幫我們用獲取類屬性的方式重寫了dispatch_request方法智玻,這樣我們就不需要再重寫dispatch_request方法绰播。
Flask程序示例代碼如下:
from flask.views import MethodView
from flask import Flask
class index(MethodView): #創(chuàng)建index類并繼承MethodView類
def get(self): #get請求
return "get"
def post(self): #post請求
return "post"
app = Flask(__name__)
app.add_url_rule("/index", view_func=index.as_view("index")) #注冊視圖函數(shù)
if __name__ == '__main__':
app.run(debug=True)
對比傳統(tǒng)視圖函數(shù)、繼承View的類視圖和繼承MethodView的類視圖尚困,明顯繼承MethodView的類視圖結(jié)構(gòu)和邏輯更清晰蠢箩。
那么怎么滿足不同的請求類型呢?
假如我有個名為total類事甜,該類繼承了MethodView類谬泌,如下所示:
class total(MethodView): #創(chuàng)建total類并繼承MethodView類
def get(self): #get請求
return "get"
def post(self): #post請求
return "post"
def put(self): #put請求
return "put"
def delete(self): #delete請求
return "delete"
該類可以處理不同的請求類,如get逻谦、post掌实、put和delete請求,那么怎樣實現(xiàn)不同的url請求類型返回對應(yīng)的請求函數(shù)呢邦马。方法很簡單贱鼻,如下所示:
view_func = total.as_view("total")
app.add_url_rule("/projects", view_func=view_func, methods=["GET"])
app.add_url_rule("/project/create", view_func=view_func, methods=["POST"])
只要在使用add_url_rule綁定視圖時,添加methods參數(shù)即可滋将。
好了邻悬,F(xiàn)lask框架——基于類的視圖就講到這里了,感謝觀看随闽,下篇文章學(xué)習(xí)Flask框架——應(yīng)用錯誤處理父丰。
公眾號:白巧克力LIN
該公眾號發(fā)布Python、數(shù)據(jù)庫掘宪、Linux蛾扇、Flask攘烛、自動化測試、Git等相關(guān)文章镀首!