Flask 正則路由匹配——轉換器

給路由傳參

有時我們需要將同一類 URL 映射到同一個視圖函數處理,比如:使用同一個視圖函數來顯示不同用戶的個人信息。

路由傳遞參數

@app.route('/user/<user_id>')  #默認爲str類型
def user_info(user_id):
    return 'hello %s' % user_id  # 用%是接收

路由傳遞的參數默認當做 string 處理,也可以指定參數的類型

路由傳遞參數指定類型

@app.route('/user/<int:user_id>')   # 指定int類型
def user_info(user_id):
    return 'hello %d' % user_id   # 使用%d接收

這裏指定int,尖括號中的內容是動態的,在此暫時可以理解爲接受 int 類型的值,實際上 int 代表使用 IntegerConverter 去處理 url 傳入的參數

flask自帶的類型有
#: the default converter mapping for the map.
DEFAULT_CONVERTERS = {
    "default": UnicodeConverter,
    "string": UnicodeConverter,
    "any": AnyConverter,
    "path": PathConverter,
    "int": IntegerConverter,
    "float": FloatConverter,
    "uuid": UUIDConverter,
}

自定義路由匹配——自動以轉換器

在 web 開發中,可能會出現限制用戶訪問規則的場景,那麼這個時候就需要用到正則匹配,根據自己的規則去限定請求參數再進行訪問

具體實現步驟爲:

  • 導入轉換器基類:在 Flask 中,所有的路由的匹配規則都是使用轉換器對象進行記錄
from werkzeug.routing import BaseConverter
  • 自定義轉換器:自定義類繼承於轉換器基類
class RegexConverter(BaseConverter):
    regex = r"[0-9]{6}"  # 規則:6位數字
  • 添加轉換器到默認的轉換器字典中
# 將自定義轉換器添加到轉換器字典中,並指定轉換器使用時名字爲: re
app.url_map.converters['re'] = RegexConverter   
# 此句很像是創建一個RegexConverter的實例對象但是後面不帶括號
  • 使用自定義轉換器實現自定義匹配規則
@app.route("/index/<re:uer_id>")
def index(uer_id):
    return "index %s" % uer_id

但是這種方式一個自定義轉換器只能滿足一個規則,所有肯定是不可行的


自定義帶參路由匹配——帶參轉換器

定義代碼如下:

class RegexConverter(BaseConverter):
    def __init__(self, url_map, *args):
        super(RegexConverter, self).__init__(url_map)
        #BaseConverter.__init__(RegexConverter,url_map)  不喜歡用super的也可以這樣寫
        # 將接受的第1個參數當作匹配規則進行保存
        self.regex = args[0]

#將自己定義的轉換器添加到默認轉換器列表中
app.url_map.converters['re']=RegexConverter

@app.route('/user/<re(r"[0-9]{6}"):user_id>')  # 在此處re()括號內填匹配規則
def index(user_id):
    return 'index  %s' % user_id

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章