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)
