Flask中的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()
相關文章
相關標籤/搜索