1. 程式人生 > >正則匹配路由

正則匹配路由

for 自定義轉換器 info 自己的 spa stc debug reg 自定義

正則匹配路由

在 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,
}

系統自帶的轉換器具體使用方式在每種轉換器的註釋代碼中有寫,請留意每種轉換器初始化的參數。

正則匹配路由