zoukankan      html  css  js  c++  java
  • 🍖五种转换器及自定义转换器

    一.转换器

    1.五种转换器(与Django中转换器相同)

    转换器名称 描述
    string 默认类型,接受不带斜杠的任何文本
    int 接受正整数
    float 接受正浮点值
    path 接收string但也接受斜线
    uuid 接受UUID(通用唯一识别码)字符串 xxxx-xxxx-xxxxx-xxxxx

    2.使用

    • 路由格式:<类型:参数名>
    # int整型
    @app.route(rule='/user2/<int:id>')
    def user2(id):
        print('type(id), id:', type(id), id)  # type(id), id: <class 'int'=""> 1
        return f'<mark>Hello {id}!'
    
    # string字符串
    @app.route(rule='/user3/<string:id>')
    def user3(id):
        print('type(id), id:', type(id), id)  # type(id), id: <class 'str'=""> zcdsb123
        return f'<mark>Hello {id}!'
    
    # string字符串
    @app.route(rule='/user4/<float:id>')
    def user4(id):
        print('type(id), id:', type(id), id)  # type(id), id: <class 'float'=""> 1.1
        return f'<mark>Hello {id}!'
    
    # path路径
    @app.route(rule='/user5/<path:id>')
    def user5(id):
        print('type(id), id:', type(id), id)  # type(id), id: <class 'str'=""> lxdsb/zcdsb
        return f'<mark>Hello {id}!'
    
    # uuid唯一识别码
    @app.route(rule='/user6/<uuid:id>')
    def user6(id):
        print('type(id), id:', type(id), id)  # type(id), id: <class 'uuid.uuid'=""> 95db2e6c-e7a7-11ea-9ca3-48ba4e4e6384
        return f'<mark>Hello {id}!'
    

    3.转换器默认配置

    • flask系统自带转换器编写在werkzeug.routing.py文件中
    #: the default converter mapping for the map.
    DEFAULT_CONVERTERS: t.Mapping[str, t.Type[BaseConverter]] = {
        "default": UnicodeConverter,
        "string": UnicodeConverter,
        "any": AnyConverter,
        "path": PathConverter,
        "int": IntegerConverter,
        "float": FloatConverter,
        "uuid": UUIDConverter,
    }
    # 每种转换器都映射到一个类, 类中书写了相应的匹配规则
    

    二.自定义转换器

    1.为什么自定义转换器

    • 关于路由参数的限制,flask内置的类型不够具体,在开发中,我们经常接受参数,需要更加精确的限制
    • 这时候,可以使用正则匹配路由参数
    • 正则匹配路由参数,其实就是扩展flask内置的路由限定类型,需要完成4个步骤

    2.自定义转换器步骤

    • 导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录
    • 自定义转换器:自定义类继承于转换器基类
    • 添加转换器到默认的转换器字典中
    • 使用自定义转换器实现自定义匹配规则

    3.自定义一个专门处理手机号的转换器

    from flask import Flask, request
    
    # 初始化
    app = Flask(import_name=__name__)
    
    
    # 编写路由视图
    @app.route(rule='/')
    def index():
        return "<h1>hello world!</h1>"
    
    
    # 1. 引入flask的路由转换器
    from werkzeug.routing import BaseConverter
    
    
    # 2. 创建自定义路由转换器,继承BaseConverter
    class MobileConverter(BaseConverter):
        def __init__(self, map, *args):
            super().__init__(map)
            self.regex = "1[3-9]d{9}"  # 匹配手机号
    
    
    # 3. 把自定义转换器添加到flask默认的转换器字典中,也就是和原来的int,float等放在一块
    app.url_map.converters['mobile'] = MobileConverter
    
    
    # 4. 类似原来的路由参数限制一样,调用自定义转换器名称即可
    @app.route(rule='/user/<mobile:mobile>')
    def user(mobile):
        return mobile
    

    4.自定义一个匹配邮箱的转换器

    # 1. 引入flask的路由转换器
    from werkzeug.routing import BaseConverter
    
    
    # 2. 创建自定义路由转换器,继承BaseConverter
    class RegexConverter(BaseConverter):
        def __init__(self, map, *args):
            super().__init__(map)
            self.regex = args[0]  # 拿到匹配时传过来的匹配规则args=(w+@w+.w+, )
    
    
    # 3. 把自定义转换器添加到flask默认的转换器字典中,也就是和原来的int,float等放在一块
    app.url_map.converters['re'] = RegexConverter
    
    
    # 4. 类似原来的路由参数限制一样,调用自定义转换器名称,这里传入的匹配规则会赋值给args
    @app.route(rule='/user/<re("w+@w+.w+"):email>')
    def user2(email):
        print(app.url_map)  # 获取所有的路由列表
        return email
    
    
    # 声明和加载配置
    class Config():
        DEBUG = True
    
    
    app.config.from_object(Config)
    

    5.万能转换器

    from flask import Flask, jsonify, views, url_for
    from werkzeug.routing import BaseConverter
    
    app = Flask(__name__)
    app.debug = True
    
    
    class RegexConverter(BaseConverter):
        """
        自定义URL匹配正则表达式
        """
    
        def __init__(self, map, regex):
            super(RegexConverter, self).__init__(map)
            # self.regex 固定的属性,专门用来存放正则表达式, flask会去使用这个属性来进行路由的正则匹配
            self.regex = regex
    
        def to_python(self, value):
            """
            路由匹配时,匹配成功后传递给视图函数中参数的值
            """
            return int(value)
    
        def to_url(self, value):
            """
            使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数
            """
            val = super(RegexConverter, self).to_url(value)
            return val
        
    # 将自定义的转换器添加到flask的应用中
    app.url_map.converters['regex'] = RegexConverter
    
    
    # regex(参数):参数传入正则表达式,这样就可以转换任何你传入的规则
    @app.route('/index/<regex("d+"):nid>', endpoint='index')
    def index(nid):
        print(nid)
        return 'This is index!'
    
    
    if __name__ == '__main__':
        app.run()
    

    </regex("d+"):nid></re("w+@w+.w+"):email></mobile:mobile></uuid:id></path:id></float:id></string:id></int:id>

  • 相关阅读:
    python2文件转换为exe可执行文件
    pycharm下 os.system os.popen执行命令返回有中文乱码
    python 虚拟环境
    git commit之后,想撤销commit
    Android Dialog使用举例
    Builder模式在Java中的应用(转)
    AngularJS promise()
    给你一个承诺
    AngularJs 用户登录验证模块(demo)参考总结
    推荐 15 个 Angular.js 应用扩展指令(参考应用)
  • 原文地址:https://www.cnblogs.com/songhaixing/p/14851612.html
Copyright © 2011-2022 走看看