衡陽商城網(wǎng)站建設(shè)seo刷關(guān)鍵詞排名免費
目錄
- 4.CBV和FBV
- 4.1 繼承 views.View
- 4.2 繼承 views.MethodView
4.CBV和FBV
前面的例子中,都是基于視圖函數(shù)構(gòu)建視圖(FBV),和Django一樣,Flask也有基于類構(gòu)建視圖(CBV)的方法。這種方式用的不多,可了解。
由于視圖類本身不是添加到路由系統(tǒng)的視圖函數(shù),真正的視圖函數(shù)是類的as_view()
的返回值。并且手動使用app.add_url_rule()
函數(shù)添加路由。
視圖類中主要有兩個常用的屬性:
- methods:表明可接受的請求方法,是個列表,可選多個;
- decorators:表明需要加在這個類的視圖函數(shù)上的裝飾器,是個列表,可選多個;
CBV有如下兩種方式:
4.1 繼承 views.View
繼承 views.View。在dispatch_request
函數(shù)中寫具體的處理邏輯,不同的請求方法需要判斷。
# CBV示例
from flask import Flask, views
import functoolsapp = Flask(__name__)def wapper(func):@functools.wraps(func)def inner(*args, **kwargs):print("inner")return func(*args, **kwargs)return innerclass IndexView(views.View):methods = ['GET', 'PUT']# 添加裝飾器,加載這個類下的方法上decorators = [wapper, ]def dispatch_request(self):if request.method == 'GET':print('GET Index')return 'Index'else if request.method == 'PUT':print('PUT Index')return 'Index'app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) # name是endpointif __name__ == '__main__':app.run()
4.2 繼承 views.MethodView
每個 HTTP 方法都映射到一個同名的類方法(名稱為小寫字母),可以完成反射。
# CBV示例
from flask import Flask, views
import functoolsapp = Flask(__name__)def wapper(func):@functools.wraps(func)def inner(*args, **kwargs):print("inner")return func(*args, **kwargs)return innerclass IndexView(views.MethodView):methods = ['GET', 'POST']# 添加裝飾器,加載這個類下的方法上decorators = [wapper, ]def get(self):print('get 請求')return 'get'def post(self):print('post 請求')return 'post'app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) # name是endpointif __name__ == '__main__':app.run()
使用這種方式,也可不提供 methods
屬性,它會自動使用相應(yīng)的類方法。