• 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)
    

      

     
  • 相关阅读:
    asp iis5.1x 2147467259 (0x80004005)
    asp 编辑 文本框为何会自动多出个逗号?
    asp 调用Recordset对象操作数据库
    windows2003 iis中播放flv格式的视频设置
    金额拆分 "万千百"..
    类似银行交易记录
    太扯了asp
    asp中通过Connection链接数据库
    给被Access过大问题困扰的网站,提供几种解决方案
    六款WEB上传组件性能测试与比较
  • 原文地址:https://www.cnblogs.com/serpent/p/9575179.html
Copyright © 2020-2023  润新知