flask作為輕型WEB框架,在web開發中,可能會出現限制用戶訪問的規則的場景,那么這個時候,就需要過濾指定用戶,所以可以使用轉換器實現。
轉換器的本質是:通過正則表達式匹配路由地址
flask 系統自帶的轉換器有
當我們自定義轉換器的時候的有以下步驟:
導入轉換器基類(BaseConverter):Flask中所有的路由的匹配規則,都是使用轉換器實現
自定義轉換器繼承於轉換器基類
添加轉換器到默認的轉換器字典中
使用自定義轉換器實現自定義匹配規則
轉換器的本質是:通過正則表達式匹配路由地址
flask 系統自帶的轉換器有
DEFAULT_CONVERTERS = { 'default': UnicodeConverter, 'string': UnicodeConverter, 'any': AnyConverter, 'path': PathConverter, 'int': IntegerConverter, 'float': FloatConverter, 'uuid': UUIDConverter, }
當我們自定義轉換器的時候的有以下步驟:
導入轉換器基類(BaseConverter):Flask中所有的路由的匹配規則,都是使用轉換器實現
自定義轉換器繼承於轉換器基類
添加轉換器到默認的轉換器字典中
使用自定義轉換器實現自定義匹配規則
既然自定義轉換器需要繼承轉換器基類(BaseConverter)那么我們看一下轉換器基類的源碼。
class BaseConverter(object): """Base class for all converters.""" regex = '[^/]+' weight = 100 def __init__(self, map): self.map = map def to_python(self, value): return value def to_url(self, value): return url_quote(value, charset=self.map.charset)
自定義轉換器代碼
from flask import Flask #導入基類轉換器 from werkzeug.routing import BaseConverter app = Flask(__name__) # 1.自定義類,繼承自BaseConverter class MyRegexConverter(BaseConverter): # 2.編寫初始化方法, init方法, 接收兩個參數, url_map, regex, 並初始化父類空間和子類空間 def __init__(self,url_map,regex): super(MyRegexConverter, self).__init__(url_map) self.regex = regex # 3.將自定義轉換器類,添加到默認的轉換列表中 app.url_map.converters['re'] = MyRegexConverter #使用自定義轉換器 #接收3位整數 @app.route('/<re("\d{3}"):num>') def hello_world(num): print("num = %s"%num) return "the num is %s"%num #接收一個手機號 @app.route('/<re("1[345678]\d{9}"):mobile>') def get_phone_number(mobile): return "the mobile is %s"%mobile if __name__ == '__main__': app.run()
自定義轉換器匹配錯誤自動跳轉網站首頁
from flask import Flask from flask import redirect from flask import url_for from werkzeug.routing import BaseConverter app = Flask(__name__) class MyConverter(BaseConverter): def __init__(self,url_map,regex): super(MyConverter, self).__init__(url_map) self.regex = regex def to_python(self, value): # 匹配成功后被調用,可以對匹配到的參數進行處理,比如轉換匹配到的數據的類型,在正則匹配完成之后,調用視圖函數之前,可以對數據進行最后的處理 return value def to_url(self, value): # 在正則匹配之前調用執行,並傳入參數,調用完成之后才開始真正的路由匹配,不關心是否匹配成功,可以通過此函數修正要傳入路由中的參數,方便更好的正則匹配 return value app.url_map.converters['re'] = MyConverter @app.route('/<re("\d{3}"):num>') def index(num): return num @app.errorhandler(404) def my_error(e): return redirect(url_for('jia')) @app.route('/jia') def jia(): return 'jai' if __name__ == '__main__': app.run(debug=True)