• Flask基础(07)-->正则自定义转换器


    正则自定义转换器

    为什么要自定义正则转换器?

    因为默认转换器太过于笨重,往往不能满足我们实际业务的需求,这时候我们就需要自定义正则转换器了。

    那么我们怎么自定义正则转换器呢?

    from flask import Flask
    from werkzeug.routing import BaseConverter
    
    app = Flask(__name__)
    
    
    class Config(object):
        DEBUG = True
    
    
    app.config.from_object(Config)
    
    
    class RegexConverter(BaseConverter):
        """自动以的正则转换器"""
        def __init__(self, url_map, *args):
            super(RegexConverter, self).__init__(url_map)
            self.regex = args[0]
    
    
    app.url_map.converters['re'] = RegexConverter
    
    """
    1.re()相当于RegexCoverter(),那么re("[0-9]{6}")相当于给RegexCoverter的__init__传递了参数“[0-9]{6}”
    2.url_map是什么我们暂时不管,直接传递给BaseConverter的__init__
    3.那么args[0]接收的就是我们定义的正则表达式
    4.self.regex其实就是对BaseConverter中regex的重写
    5.BaseConverter的这个原生regex:regex = '[^/]+'
    """
    @app.route('/user/<re("[0-9]{6}"):user_id>')
    def demo1(user_id):
        return "用户的id是:%s"%user_id
    
    
    @app.route('/')
    def hello_world():
        return 'Hello World!!!'
    
    
    if __name__ == '__main__':
        app.run()

    转换器to_python

    # 转换器to_python
    from flask import Flask
    from werkzeug.routing import BaseConverter
    from flask import  redirect
    
    # 创建Flask的应用程序
    app = Flask(__name__)
    
    class ListConverter(BaseConverter):
        regex = "(\d+,?)+\d$"
        def to_python(self,value):
            return  value.split(",")
    
    app.url_map.converters['list'] = ListConverter
    
    @app.route('/test1/<list:user_ids>')
    def demo1(user_ids):
        return 'user_id是:%s' % user_ids
    
    if __name__ == '__main__':
        # app 运行的参数 ip地址,端口,是否开启调试
        app.run(debug=True)
    
    """
    to_python转换器的程序运行:
    1.浏览器向服务器发起访问:http://127.0.0.1:5000/test1/1,2,3
    2.<list:user_ids>将'1,2,3'动态传到ListConverter对象内部进行regex正则匹配
    3.匹配成功之后,再由to_python以','为分隔符,划分字符串,最后返回浏览器一个列表
    
    """

    附上一张分析图供大家学习:

    转换器to_python

    # 导入Flask
    from flask import Flask
    from werkzeug.routing import BaseConverter
    from flask import  redirect,url_for
    
    # 创建Flask的应用程序
    app = Flask(__name__)
    
    
    class ListConverter(BaseConverter):
        regex = "(\d+,?)+\d$"
    
        def to_python(self, value):
            return value.split(",")  # 返回一个列表
    
        def to_url(self, value):
            result = ",".join(str(v) for v in value)
            return result  # 返回一个字符串
    
    
    app.url_map.converters['list'] = ListConverter
    
    
    @app.route('/test1/<list:user_ids>')
    def demo1(user_ids):
        return 'user_id是:%s' % user_ids
    
    @app.route('/demo2')
    def demo2():
        return redirect(url_for("demo1",user_ids=[1,2,3,4]))
    
    if __name__ == '__main__':
        # app 运行的参数 ip地址,端口,是否开启调试
        app.run(debug=True)
    
    """
    to_url自定义转换器程序运行:
    1.浏览器向服务器发起访问:http://127.0.0.1:5000/demo2
    2.<list:user_ids>将[1,2,3,4]动态传到to_url函数先将[1,2,3,4]进行字符串化,然后进行regex正则匹配
    3.匹配成功之后,重定向到http://127.0.0.1:5000/test1/1,2,3,4,并且将users_ids=[1,2,3,4]传给demo1(user_ids),所以
    浏览器将输出user_ids的值是:[1,2,3,4]
    """

    附上一张to_url分析图供大家理解学习:

    看到这里也许大家很头疼,to_python和to_url到底是什么鬼,到底怎么记忆他们的用处和执行顺序。其实理解了也很简单:

    可以这样的简化记忆

    to_python:正则匹配,to_python函数处理,返回给视图函数

    to_url:to_url函数处理,正则匹配,返回给重定向目标视图函数

    那么可能你又要问了,为什么要这样搞,有什么用处?

    呵呵,很简单,因为我们在项目中拿到的数据不一定都是我们正好需求的,当我们拿到一个列表,而我们又正好需要用这个列表中进行页面跳转,

    那么这时候就可以用to_url来处理;to_python也是一样的道理,都是进行数据的处理,从而达到我们需求。

    (还有不明白的可以下方留言,大家一起探讨↓↓↓↓↓↓)

  • 相关阅读:
    用GDB调试程序(七)
    postman——基础操作——cookies
    postman——基础操作——生成代码片段
    postman——集合——定义和访问变量——全部变量、环境变量、集合变量等
    postman——基础操作——捕获http请求(内置代理、拦截器)
    postman——基础操作——代理(类似于fiddler)
    postman——集合——变量入门
    postman——集合——定义和访问变量——环境(environment)变量
    postman——基础操作——证书
    postman——基础操作——API授权
  • 原文地址:https://www.cnblogs.com/888888CN/p/9474131.html
Copyright © 2020-2023  润新知