天天看點

【Flask】路由裝飾器、路徑傳參、自定義路由轉換器

1.路由

路由就是根據請求方式和url确定由哪個視圖函數進行處理,不像Django通過路由清單,Flask是通過裝飾器的方式

@app.route()

指定視圖函數以及支援的請求方式,該方法可以傳入url和methods

from flask import Flask

app = Flask(__name__)

@app.route(rule="/index", methods=["get", "post"])  # 指定路徑,支援的請求方式(可使用預設的)
def index():
    return "index"

if __name__ == '__main__':
    print(app.url_map)  # 列印所有的路由規則
    app.run(debug=True)
           

app.route()方法主要有兩個參數,rule 是必須以“ / ”開頭的路徑,methods 是一個list或tuple,限定支援的請求方式

另外,可以通過

app.url_map

屬性擷取所有的路由規則

2.路徑傳參

傳參的方式有多種,比如說請求頭、表單、非表單等、查詢字元串等,當然還有路徑傳參,如果遇到路徑傳參,我們就需要把它提取出來

格式是:

/xx/<路由變量>

from flask import Flask

app = Flask(__name__)

@app.route(rule="/user_id/<uid>")  # 用<>指定路徑變量名為uid
def index(uid):
    return uid

if __name__ == '__main__':
    app.run(debug=True)

           
2.1 路由轉換器

直接使用<>指定的變量是str類型的,如果需要特定的類型,可以使用類型轉換器。

其實每個類型轉換器都是一個類,繼承于BaseConverter類,該類位置是werkzeug.routing.BaseConverter

以下是預設的類型轉換器,位于werkzeug.routing的DEFAULT_CONVERTERS清單中

DEFAULT_CONVERTERS = {
    "default": UnicodeConverter,
    "string": UnicodeConverter,
    "any": AnyConverter,
    "path": PathConverter,
    "int": IntegerConverter,
    "float": FloatConverter,
    "uuid": UUIDConverter,
}

           

比如說,我們需要把路徑參數轉換成一個int類型

from flask import Flask

app = Flask(__name__)

@app.route(rule="/user_id/<int:uid>")  # 将參數uid轉換成int類型
def index(uid):
    print(type(uid))
    return str(uid)

if __name__ == '__main__':
    app.run(debug=True)
           
2.2 自定義路由轉換器

因為已有的轉換器不能滿足我們的需求,比如說,想要一個手機号或郵箱類型的轉換器,我們就得自己寫一個了。思路很簡單,就是繼承

BaseConverter

這個類,然後重寫

regex

屬性實作正則比對,再把自定義的類添加到

app.url_map.converters

這個字典裡即可

from flask import Flask
from werkzeug.routing import BaseConverter

app = Flask(__name__)

# 自定義類型轉換器
class MobileConverter(BaseConverter):
    regex = "1[3-9]\d{9}$"  # 比對規則,不要以^開頭

app.url_map.converters["mobile"] = MobileConverter  # 添加到轉換器清單

@app.route(rule="/user/<mobile:mobile>")  # 将參數uid轉換成mobile類型
def index(mobile):
    print(type(mobile))
    return str(mobile)

if __name__ == '__main__':
    app.run(debug=True)