關(guān)于Flask 視圖介紹
1、視圖函數(shù)
之前的文章說(shuō)過(guò),在 Flask 中路由是請(qǐng)求的 url 與處理函數(shù)之間的映射,使用app.route裝飾器將處理函數(shù)和 url 綁定,路由綁定的處理函數(shù)就被成為視圖函數(shù)。
@app.route('/user/<name>')
def hello_user(name):
return 'Hello {}!'.format(name)
上面的hello_user()函數(shù)就是一個(gè)簡(jiǎn)單的視圖函數(shù)。
當(dāng)然我們也可以不使用app.route裝飾器,使用app.add_url_rule()方法也可將視圖函數(shù)和 url 進(jìn)行綁定,實(shí)際上裝飾器app.route也是調(diào)用的app.add_url_rule()方法。
def hello():
return 'hello Flask!'
app.add_url_rule('/hello', view_func=hello)
通過(guò)app.add_url_rule()方法,可以將路由同視圖分開(kāi),方便將路由進(jìn)行統(tǒng)一管理。
2、類(lèi)視圖
我們之前包括上面使用的,都是基于函數(shù)的視圖,這雖然是最簡(jiǎn)單便捷的用法,但是不容易擴(kuò)展,其實(shí)視圖函數(shù)也可以基于類(lèi)來(lái)實(shí)現(xiàn),好處就是類(lèi)支持繼承,可以把一些共性的代碼放在父類(lèi)中,其他子類(lèi)可以繼承,在某些情況下,使用類(lèi)更合理,更易于擴(kuò)展。
類(lèi)視圖分為標(biāo)準(zhǔn)類(lèi)視圖和基于調(diào)度方法的類(lèi)視圖,下面分別介紹一下。
2.1 標(biāo)準(zhǔn)類(lèi)視圖
標(biāo)準(zhǔn)類(lèi)視圖的寫(xiě)法:
- 父類(lèi)必須繼承
flask.views.View類(lèi) - 子類(lèi)實(shí)現(xiàn)
dispatch_request()方法,完成自身的業(yè)務(wù)邏輯并返回結(jié)果 - 子類(lèi)使用
app.add_url_rule()進(jìn)行注冊(cè),其中view_func參數(shù)使用as_view()方法做類(lèi)方法轉(zhuǎn)換 - 如果注冊(cè)時(shí)指定了
endpoint參數(shù),endpoint的值會(huì)覆蓋指定的視圖名稱,使用url_for時(shí)就必須使用endpoint指定的值
具體使用方式如下:
from flask.views import View
class ParentView(View):
def __init__(self):
super().__init__()
# 公共部分信息
self.public_data = 'Flask Web App'
class Index(ParentView):
methods = ['GET']
def dispatch_request(self):
return self.public_data + " index"
class User(ParentView):
methods = ['POST']
def dispatch_request(self):
return self.public_data + " user"
app.add_url_rule('/index', endpoint='index', view_func=Index.as_view('index'))
app.add_url_rule('/user', endpoint='user', view_func=User.as_view('user'))
上述代碼中創(chuàng)建了一個(gè) ParentView 類(lèi),繼承自 flask.views.View 類(lèi),然后創(chuàng)建了 Index 和 User 兩個(gè)類(lèi)繼承自 ParentView 類(lèi),并分別重寫(xiě)實(shí)現(xiàn)了dispatch_request()函數(shù),使用了父類(lèi) ParentView 的屬性public_data, 實(shí)現(xiàn)自己的業(yè)務(wù)邏輯。然后我們通過(guò)as_view()方法把類(lèi)轉(zhuǎn)換為實(shí)際的視圖函數(shù),as_view()必須傳入一個(gè)唯一不重復(fù)的視圖名。此后,這個(gè)視圖由app.add_url_rule()方法和指定路由綁定。
類(lèi)視圖支持的 HTTP 請(qǐng)求方法由視圖類(lèi)變量methods指定,默認(rèn)只支持 GET 請(qǐng)求。
2.1.1 基于方法的視圖
如果視圖支持多種 HTTP 請(qǐng)求方法的話,之前我們都是在視圖函數(shù)中進(jìn)行判斷,根據(jù)不同的請(qǐng)求方法執(zhí)行不同的業(yè)務(wù)邏輯,那有沒(méi)有更簡(jiǎn)單的方法呢?是有的,Flask 中的方法類(lèi)視圖 flask.views.MethodView 就可以做到,它是 flask.views.View 的子類(lèi),通過(guò)定義和請(qǐng)求方式同名的小寫(xiě)方法來(lái)完成了邏輯處理,不必提供methods屬性,每個(gè) HTTP 方法都映射到一個(gè)具有相同名稱(小寫(xiě))的函數(shù)。
下面看下詳細(xì)使用方法。
from flask.views import MethodView
class UserView(MethodView):
def get(self):
user_id = request.args.get("user_id")
return "Hello user:{}".format(user_id)
def post(self):
name = request.form.get("name")
password = request.form.get("password")
if name == "admin" and password == "123456":
return "hello admin!"
else:
return "not allow!"
app.add_url_rule('/user/get_info', view_func=UserView.as_view('get'))
app.add_url_rule('/user/login', view_func=UserView.as_view('post'))
代碼中定義的get()函數(shù)用于處理 GET 請(qǐng)求,post()函數(shù)用于處理 POST 請(qǐng)求,代碼中省去了 HTTP 請(qǐng)求方法的判斷語(yǔ)句,而且是不是更加RESTFul一些了。
請(qǐng)求測(cè)試:

到此這篇關(guān)于 關(guān)于Flask 視圖介紹的文章就介紹到這了,更多相關(guān)Flask 視圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用dict.fromkeys()快速生成一個(gè)字典示例
這篇文章主要介紹了Python使用dict.fromkeys()快速生成一個(gè)字典,結(jié)合實(shí)例形式分析了Python基于dict.fromkeys()生成字典的相關(guān)操作技巧,需要的朋友可以參考下2019-04-04
Python自動(dòng)檢測(cè)requests所獲得html文檔的編碼
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)Python自動(dòng)檢測(cè)requests實(shí)現(xiàn)獲得html文檔的編碼,文中的示例代碼講解詳細(xì),感興趣的可以了解下2024-11-11
Python實(shí)現(xiàn)微信消息防撤回功能的實(shí)例代碼
這篇文章主要介紹了Python實(shí)現(xiàn)微信消息防撤回 ,需要的朋友可以參考下2019-04-04
pytorch對(duì)可變長(zhǎng)度序列的處理方法詳解
今天小編就為大家分享一篇pytorch對(duì)可變長(zhǎng)度序列的處理方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
django使用圖片延時(shí)加載引起后臺(tái)404錯(cuò)誤
本文給大家介紹的是作者在Django中使用圖片的延時(shí)加載技術(shù)后引起后臺(tái)404錯(cuò)誤的問(wèn)題以及解決思路和方法,有需要的小伙伴可以參考下2017-04-04
使用C語(yǔ)言擴(kuò)展Python程序的簡(jiǎn)單入門(mén)指引
這篇文章主要介紹了使用C語(yǔ)言擴(kuò)展Python程序的簡(jiǎn)單入門(mén)指引,來(lái)自于IBM官網(wǎng)網(wǎng)站技術(shù)文檔,需要的朋友可以參考下2015-04-04

