Flask框架——基于類視圖

上篇文章我們學(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)文章镀首!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坟漱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子更哄,更是在濱河造成了極大的恐慌芋齿,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竖瘾,死亡現(xiàn)場離奇詭異沟突,居然都是意外死亡花颗,警方通過查閱死者的電腦和手機捕传,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扩劝,“玉大人庸论,你說我怎么就攤上這事“羟海” “怎么了聂示?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長簇秒。 經(jīng)常有香客問我鱼喉,道長,這世上最難降的妖魔是什么趋观? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任扛禽,我火速辦了婚禮,結(jié)果婚禮上皱坛,老公的妹妹穿的比我還像新娘编曼。我一直安慰自己,他們只是感情好剩辟,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布掐场。 她就那樣靜靜地躺著,像睡著了一般贩猎。 火紅的嫁衣襯著肌膚如雪熊户。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天吭服,我揣著相機與錄音敏弃,去河邊找鬼。 笑死噪馏,一個胖子當著我的面吹牛麦到,可吹牛的內(nèi)容都是我干的绿饵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼瓶颠,長吁一口氣:“原來是場噩夢啊……” “哼拟赊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粹淋,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吸祟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后桃移,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屋匕,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年借杰,在試婚紗的時候發(fā)現(xiàn)自己被綠了过吻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔗衡,死狀恐怖纤虽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绞惦,我是刑警寧澤逼纸,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站济蝉,受9級特大地震影響杰刽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜王滤,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一贺嫂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淑仆,春花似錦涝婉、人聲如沸冬阳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽展融。三九已至寞射,卻和暖如春渔工,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桥温。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工引矩, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓旺韭,卻偏偏與公主長得像氛谜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子区端,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容

  • 摘要:Flask,視圖沥邻,視圖函數(shù)危虱,類視圖,方法視圖唐全,裝飾器埃跷,藍圖 視圖函數(shù) 在Flask中路由是指用戶請求的URL...
    xiaogp閱讀 4,739評論 0 2
  • 基于類的視圖 Django中的視圖是一個可調(diào)用對象,它接收一個請求然后返回一個響應(yīng)芦瘾。這個可調(diào)用對象不僅僅限于函數(shù)捌蚊,...
    蘭山小亭閱讀 4,581評論 1 13
  • 類視圖 之前我們接觸的視圖都是函數(shù)集畅,所以一般簡稱視圖函數(shù)近弟。其實視圖也可以基于類來實現(xiàn),類視圖的好處是支持繼承挺智,但是...
    編程小蟬閱讀 1,834評論 0 3
  • 類視圖 之前我們接觸的視圖都是函數(shù)祷愉,所以一般簡稱視圖函數(shù)。其實視圖也可以基于類來實現(xiàn)赦颇,類視圖的好處是支持繼承二鳄,但是...
    yungege閱讀 361評論 1 0
  • 1. add_url_rule(rule,endponint=None,view_func) 這個方法用來添加u...
    寬哥好閱讀 787評論 0 0