1、視圖函數(shù)
之前的文章說過,在 Flask 中路由是請求的 url 與處理函數(shù)之間的映射,使用app.route裝飾器將處理函數(shù)和 url 綁定,路由綁定的處理函數(shù)就被成為視圖函數(shù)。
1
2
3
4
5
|
@app .route( '/user/<name>' ) def hello_user(name): return 'Hello {}!' . format (name) |
上面的hello_user()
函數(shù)就是一個(gè)簡單的視圖函數(shù)。
當(dāng)然我們也可以不使用app.route
裝飾器,使用app.add_url_rule()
方法也可將視圖函數(shù)和 url
進(jìn)行綁定,實(shí)際上裝飾器app.route
也是調(diào)用的app.add_url_rule()
方法。
1
2
3
4
5
|
def hello(): return 'hello Flask!' app.add_url_rule( '/hello' , view_func = hello) |
通過app.add_url_rule()
方法,可以將路由同視圖分開,方便將路由進(jìn)行統(tǒng)一管理。
2、類視圖
我們之前包括上面使用的,都是基于函數(shù)的視圖,這雖然是最簡單便捷的用法,但是不容易擴(kuò)展,其實(shí)視圖函數(shù)也可以基于類來實(shí)現(xiàn),好處就是類支持繼承,可以把一些共性的代碼放在父類中,其他子類可以繼承,在某些情況下,使用類更合理,更易于擴(kuò)展。
類視圖分為標(biāo)準(zhǔn)類視圖和基于調(diào)度方法的類視圖,下面分別介紹一下。
2.1 標(biāo)準(zhǔn)類視圖
標(biāo)準(zhǔn)類視圖的寫法:
-
父類必須繼承
flask.views.View
類 -
子類實(shí)現(xiàn)
dispatch_request()
方法,完成自身的業(yè)務(wù)邏輯并返回結(jié)果 -
子類使用
app.add_url_rule()
進(jìn)行注冊,其中view_func
參數(shù)使用as_view()
方法做類方法轉(zhuǎn)換 -
如果注冊時(shí)指定了
endpoint
參數(shù),endpoint
的值會(huì)覆蓋指定的視圖名稱,使用url_for
時(shí)就必須使用endpoint
指定的值
具體使用方式如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
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
類,繼承自 flask.views.View
類,然后創(chuàng)建了 Index
和 User
兩個(gè)類繼承自 ParentView
類,并分別重寫實(shí)現(xiàn)了dispatch_request()
函數(shù),使用了父類 ParentView
的屬性public_data
, 實(shí)現(xiàn)自己的業(yè)務(wù)邏輯。然后我們通過as_view()
方法把類轉(zhuǎn)換為實(shí)際的視圖函數(shù),as_view()
必須傳入一個(gè)唯一不重復(fù)的視圖名。此后,這個(gè)視圖由app.add_url_rule()
方法和指定路由綁定。
類視圖支持的 HTTP
請求方法由視圖類變量methods
指定,默認(rèn)只支持 GET 請求。
2.1.1 基于方法的視圖
如果視圖支持多種 HTTP 請求方法的話,之前我們都是在視圖函數(shù)中進(jìn)行判斷,根據(jù)不同的請求方法執(zhí)行不同的業(yè)務(wù)邏輯,那有沒有更簡單的方法呢?是有的,Flask
中的方法類視圖 flask.views.MethodView
就可以做到,它是 flask.views.View
的子類,通過定義和請求方式同名的小寫方法來完成了邏輯處理,不必提供methods屬性,每個(gè) HTTP 方法都映射到一個(gè)具有相同名稱(小寫)的函數(shù)。
下面看下詳細(xì)使用方法。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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 請求,post()
函數(shù)用于處理 POST 請求,代碼中省去了 HTTP 請求方法的判斷語句,而且是不是更加RESTFul
一些了。
請求測試:
到此這篇關(guān)于 關(guān)于Flask 視圖介紹的文章就介紹到這了,更多相關(guān)Flask 視圖內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://juejin.cn/post/7032867176088338445