Flask中的CBV以及正則表達式 一.CBV 二.正則表達式 ...
Flask中的CBV以及正則表達式
一.CBV
def auth(func):
def inner(*args, **kwargs):
print('before')
result = func(*args, **kwargs)
print('after')
return result
return inner
class IndexView(views.View):
methods = ['GET']
decorators = [auth, ]
def dispatch_request(self):
print('Index')
return 'Index!'
#如果不傳name,這所有返回的都是view,這樣就會報錯,所有人家必須你要傳遞參數
#然後他傳遞給view_func的其實就是你視圖類中的dispatch_request方法。這樣我們沒有辦法,在一個視圖類中寫多種請求方式
app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) # name=endpoint
#或者,通常用此方式
class IndexView(views.MethodView):
methods = ['GET']
#cbv添加裝飾,用這個,我們看as_view中就知道了
decorators = [auth, ]
def get(self):
return 'Index.GET'
def post(self):
return 'Index.POST'
#如果我們繼承了MethodView,他幫我們重寫了,dispatch_request方法,他給我們做了一個分發,通過請求,來執行不同的函數
app.add_url_rule('/index', view_func=IndexView.as_view(name='index')) # name=endpoint
二.正則表達式
#1 寫類,繼承BaseConverter
#2 註冊:app.url_map.converters['regex'] = RegexConverter
# 3 使用:@app.route('/index/<regex("\d+"):nid>') 正則表達式會當作第二個參數傳遞到類中
from flask import Flask, views, url_for
from werkzeug.routing import BaseConverter
app = Flask(import_name=__name__)
class RegexConverter(BaseConverter):
"""
自定義URL匹配正則表達式
"""
def __init__(self, map, regex):
super(RegexConverter, self).__init__(map)
self.regex = regex
def to_python(self, value):
"""
路由匹配時,匹配成功後傳遞給視圖函數中參數的值
"""
return int(value)
def to_url(self, value):
"""
使用url_for反向生成URL時,傳遞的參數經過該方法處理,返回的值用於生成URL中的參數
"""
val = super(RegexConverter, self).to_url(value)
return val
# 添加到flask中
app.url_map.converters['regex'] = RegexConverter
@app.route('/index/<regex("\d+"):nid>') #這裡是調用to_python方法.且先執行to_python再運行index函數
def index(nid):
print(url_for('index', nid='888')) #這裡其實調用to_url方法
return 'Index'
if __name__ == '__main__':
app.run()