1.Django中的CBV模式
2.Flask中的CBV和FBV
def auth(func):
def inner(*args, **kwargs):
result = func(*args, **kwargs)
return result
return inner
class IndexView(views.MethodView):
# methods = ['POST'] #只允許POST請求訪問
decorators = [auth,] # 如果想給所有的get,post請求加裝飾器,就可以這樣來寫,也可以單個指定
def get(self): #如果是get請求需要執行的代碼
v = url_for('index')
print(v)
return "GET"
def post(self): #如果是post請求執行的代碼
return "POST"
app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) #name即FBV中的endpoint,指別名
if __name__ == '__main__':
app.run()
類視圖及其使用
視圖函數不能面向對象編程,利用類視圖來代替視圖函數來解決這個問題
導入視圖類 View
from flask.views import View
編寫一個視圖子類
class MyView(View): # MyView繼承于View
def test(self): # 自定義的方法
return '測試類視圖'
def dispatch_request(self): # 必須重寫這個方法
resp = self.test()
return resp
利用View子類獲取到一個視圖方法
MyView.as_view('test')
注意:.as_view方法的放回值是一個方法,而且該方法的名字就是傳進去的參數
將獲取到的視圖方法和路徑對應起來
app.add_url_rule('/test/', view_func=MyView.as_view('test')) # MyView.as_view('test') 返回的是一個方法
類視圖的原理
把as_view方法返回的結果賦值給view_func
as_view方法返回的是一個方法(注意:as_view方法傳入的參數就是as_view返回的那個方法的名字),該方法會調用dispatch_request方法
一旦路由進來,就會調用 dispatch_request 方法
類視圖的目的就是實現邏輯分離、方便管理
from flask import Flask
from flask.views import View
app = Flask(__name__)
@app.route('/')
def index():
return 'Hello World'
class MyView(View): # MyView繼承于View
def test(self): # 自定義的方法
return '測試類視圖'
def dispatch_request(self): # 必須重寫這個方法
resp = self.test()
return resp
app.add_url_rule('/test/', view_func=MyView.as_view('test')) # MyView.as_view('test') 返回的是一個方法
print(app.url_map)
if __name__ == '__main__':
app.run(debug=True)
# 把as_view方法返回的結果賦值給view_func
# as_view方法返回的是一個方法(注意:as_view方法傳入的參數就是as_view返回的那個方法的名字),該方法會調用dispatch_request方法
# 一旦路由進來,就會調用 dispatch_request 方法
# 類視圖的目的就是實現邏輯分離、方便管理
方法視圖及其使用
利用視圖函數實現不同的請求執行不同的邏輯時比較復雜,需要在視圖函數函數中進行判斷;如果利用方法視圖實現就比較簡單
@app.route('/test/', methods=['GET', 'POST'])
def test():
if request.method == 'GET':
# 做GET的事情
pass
elif request.method == 'POST':
# 做POST的事情
pass
return '測試'
導入方法視圖類
from flask.views import MethodView
創建方法視圖子類
class TestMethodView(MethodView):
def get(self):
# 處理Get請求
return 'GET請求'
def post(self):
# 處理post請求
return 'POST請求'
注意:視圖類中的方法就是支持的請求類型
利用方法視圖子類創建一個視圖函數
TestMethodView.as_view('testMethodView')
注意:as_view返回的是一個視圖函數,而且該視圖函數逇名稱就是傳進去的參數
將獲取到的視圖方法和路徑對應起來
app.add_url_rule('/test02/', view_func=TestMethodView.as_view('testMethodView'))
from flask import Flask
from flask import request
from flask.views import MethodView
app = Flask(__name__)
@app.route('/')
def index():
return '測試主頁面'
@app.route('/test/', methods=['GET', 'POST'])
def test():
if request.method == 'GET':
# 做GET的事情
pass
elif request.method == 'POST':
# 做POST的事情
pass
return '測試'
class TestMethodView(MethodView):
def get(self):
# 處理Get請求
return 'GET請求'
def post(self):
# 處理post請求
return 'POST請求'
app.add_url_rule('/test02/', view_func=TestMethodView.as_view('testMethodView'))
# method = TestMethodView.as_view('testMethodView');
# app.add_url_rule('/test02/
/', view_func=method, methods=['GET'])
print(app.url_map)
if __name__ == '__main__':
app.run(debug=True)
雖然在方法視圖中定義的函數就是支持的請求類型,但是我們可以在配置路徑時指定哪個路徑對應哪中類型的請求
利用方法視圖子類獲取一個名字為testMethodView02的視圖函數,該視圖函數只能支持GET請求,而且支持轉換器
method02 = TestMethodView.as_view('testMethodView02');
app.add_url_rule('/test02/
/', view_func=method02, methods=['GET'])
利用利用方法視圖子類獲取一個名字為testMethodView03的視圖函數,該視圖函數只能支持POST請求
method03 = TestMethodView.as_view('testMethodView03')
app.add_url_rule('/test03/', view_func=method03, methods=['POST'])
模擬POST請求
from flask import Flask
from flask import request
from flask.views import MethodView
'''
遇到不懂的問題?Python學習交流群:821460695滿足你的需求,資料都已經上傳群文件,可以自行下載!
'''
app = Flask(__name__)
@app.route('/')
def index():
return '測試主頁面'
@app.route('/test/', methods=['GET', 'POST'])
def test():
if request.method == 'GET':
# 做GET的事情
pass
elif request.method == 'POST':
# 做POST的事情
pass
return '測試'
class TestMethodView(MethodView):
def get(self, name):
# 處理Get請求, 也可以在這些方法中調用其他的方法
return 'GET請求' + name
def post(self):
# 處理post請求, 也可以在這些方法中調用其他的方法
return 'POST請求'
# app.add_url_rule('/test02/', view_func=TestMethodView.as_view('testMethodView'))
method02 = TestMethodView.as_view('testMethodView02');
app.add_url_rule('/test02/
/', view_func=method02, methods=['GET'])
method03 = TestMethodView.as_view('testMethodView03')
app.add_url_rule('/test03/', view_func=method03, methods=['POST'])
print(app.url_map)
if __name__ == '__main__':
app.run(debug=True)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
