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

冰冷的希望發表於2020-10-29

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)

相關文章