正則匹配路由
正則匹配路由
在 web 開發中,可能會出現限制用戶訪問規則的場景,那麽這個時候就需要用到正則匹配,根據自己的規則去限定請求參數再進行訪問
具體實現步驟為:
- 導入轉換器基類:在 Flask 中,所有的路由的匹配規則都是使用轉換器對象進行記錄
- 自定義轉換器:自定義類繼承於轉換器基類
- 添加轉換器到默認的轉換器字典中
- 使用自定義轉換器實現自定義匹配規則
代碼實現
- 導入轉換器基類
from werkzeug.routing import BaseConverter
- 自定義轉換器
# 自定義正則轉換器
class RegexConverter(BaseConverter):
def __init__(self, url_map, *args):
super(RegexConverter, self).__init__(url_map)
# 將接受的第1個參數當作匹配規則進行保存
self.regex = args[0]
- 添加轉換器到默認的轉換器字典中,並指定轉換器使用時名字為: re
app = Flask(__name__)
# 將自定義轉換器添加到轉換器字典中,並指定轉換器使用時名字為: re
app.url_map.converters[‘re‘] = RegexConverter
- 使用轉換器去實現自定義匹配規則
- 當前此處定義的規則是:3位數字
@app.route(‘/user/<re("[0-9]{3}"):user_id>‘)
def user_info(user_id):
return "user_id 為 %s" % user_id
自定義轉換器其他兩個函數實現
繼承於自定義轉換器之後,還可以實現 to_python 和 to_url 這兩個函數去對匹配參數做進一步處理:
- to_python:
- 該函數參數中的 value 值代表匹配到的值,可輸出進行查看
- 匹配完成之後,對匹配到的參數作最後一步處理再返回,比如:轉成 int 類型的值再返回:
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
@app.route("/")
def index():
return "index"
class Regexconverter(BaseConverter):
def __init__(self,url_map,*args):
super(Regexconverter, self).__init__(url_map)
self.regex = args[0]
# def to_python(self, value):
# return int(value)
app.url_map.converters["re"] = Regexconverter
@app.route("/user/<re(‘[0-9]{4}‘):user_id>")
def demo1(user_id):
print(type(user_id))
return "當前user_id為%s" % user_id
if __name__ == ‘__main__‘:
app.run(debug = True)
運行測試,在視圖函數中可以查看參數的類型,由之前默認的 str 已變成 int 類型的值
- to_url:
- 在使用 url_for 去獲取視圖函數所對應的 url 的時候,會調用此方法對 url_for 後面傳入的視圖函數參數做進一步處理
- 具體可參見 Flask 的 app.py 中寫的示例代碼:ListConverter
系統自帶轉換器
DEFAULT_CONVERTERS = {
‘default‘: UnicodeConverter,
‘string‘: UnicodeConverter,
‘any‘: AnyConverter,
‘path‘: PathConverter,
‘int‘: IntegerConverter,
‘float‘: FloatConverter,
‘uuid‘: UUIDConverter,
}
系統自帶的轉換器具體使用方式在每種轉換器的註釋代碼中有寫,請留意每種轉換器初始化的參數。
正則匹配路由