flask中的CBV和FBV
flask中CBV使用
from flask import Flask, viewsapp = Flask(__name__)class Login(views.MethodView):methods = ['POST', 'GET']# 如果需要在CBV中加裝飾器的話,括號里就是裝飾器的內(nèi)存地址,可以傳多個decorators = ()def get(self):print('get 請求')return 'login get'def post(self):print('post 請求')return 'login post'app.add_url_rule('/login', view_func=Login.as_view(name='login'))if __name__ == "__main__":app.run(debug=True)Login.as_view(name='login') 先對這段代碼就行解析吧
Login : 它是我們寫一個視圖類對吧
as_view : 由類直接調(diào)用,他應該就是類里的一個函數(shù)(這里看不錯它是對象方法,還是類方法,還是靜態(tài)方法),
因為類可以調(diào)用它下面的所有函數(shù)對吧,在我們的Login 并沒有寫as_view 這個函數(shù),所以這個函數(shù)應該在它繼承的類中,我們順著這個基類去找找看,最終我們在View這個類中找到
它做了下面這幾件事:
提醒一點:
在上面的app.add_url_rule 這個方法里,我并沒有寫endpoint 這個屬性,那么最終會以view_func 所對應的函數(shù)的__name__ 方法作為endpoint 的值,那么我上面代碼的基礎上再寫一個Register的視圖函,再創(chuàng)建一個路由試圖關系,也就是執(zhí)行app.add_url_rule,他們的view_func對應的都是view函數(shù)的內(nèi)存地址,你說會不會報錯呢?
答案:是不會報錯的,因為你在as_view方法里傳了一個name的參數(shù),其實這個name相當于就是endpoint,所以這個name 你是不可以相同的,在as_view方法里,它有這樣的一步操作view.__name__=name ,所以返回的view的__name__ 的值是不同的。
那么來了一個請求,它的url是/login ,然后這個視圖類中是怎么執(zhí)行的呢?
首先我們創(chuàng)建路由關系,比如這樣的 "/login" -->> (這是允許請求的方法) -->> login(記住這是endpoint的值,其實他真正對應的是view這個函數(shù)的內(nèi)存地址)
請求來了,便會去執(zhí)行這個view 函數(shù)
view.view_class :就是Login視圖類,那么self就是Login的實例對象
最終返回了 self.dispatch_request(*args, **kwargs)這個方法的返回值
很明顯我們寫的Login 視圖類中沒有dispatch_request這個方法,那么我們繼續(xù)在它的基類里尋找,最終在MethodView這個基類里找到了
request.method.lower() 就是這次請求的方法,self 就是Login的實例對象,
通過getattr獲取到以請求方法小寫的方法的內(nèi)存地址。這里根本沒有判斷該視圖類允許的請求方法,所以說我在寫視圖類的時候,methods這個屬性是不是可以不用寫呢?等下我去試試
然后就是一系列的判斷,斷言什么的,很容易看懂就不說了
最終是執(zhí)行了meth這個方法,將它的返回值返回回去
所以說view這個函數(shù)的返回值,也就是meth的返回值
總結下CBV:
寫一個定義CBV流程:
首先導入views,`from flask import views
自定義一個視圖類,并且繼承Views.MethodView
如果你要給你的視圖類加裝飾器的話,在該視圖類中寫decorator ,它是一個列表,你把裝飾器函數(shù)的內(nèi)存地址寫進去好了
然后根據(jù)不同的請求,寫相應的方法,比如對get請求寫相關的方法,def get(self):pass 就好了,其他請求方法都是一個
最后配置好路由和視圖函數(shù)之間的關系就好了
app.add_url_rule('路徑',view_func=視圖類.as_view(name='一般就以視圖類名小寫吧,總之不能有重名'))
寫執(zhí)行CVB的流程
flask中FBV
沒啥好講的,寫段FVB的代碼吧
from flask import Flaskapp = Flask(__name__)@app.route('/index') def index():return "index page"if __name__ == "__main__":app.run(debug=True)轉載于:https://www.cnblogs.com/zhuchunyu/p/10466512.html
總結
以上是生活随笔為你收集整理的flask中的CBV和FBV的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 1904 King's Ques
- 下一篇: 记一次线上并发问题