flask自定义转换器

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)

  

 
posted @ 2018-09-02 20:18  贾祥飞  阅读(2081)  评论(1编辑  收藏  举报