1. 程式人生 > >flask自定義轉換器

flask自定義轉換器

mobile highlight 代碼 run 繼承 port csharp phone brush

flask作為輕型WEB框架,在web開發中,可能會出現限制用戶訪問的規則的場景,那麽這個時候,就需要過濾指定用戶,所以可以使用轉換器實現。
轉換器的本質是:通過正則表達式匹配路由地址
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)

  

flask自定義轉換器