正则自定义转换器
为什么要自定义正则转换器?
因为默认转换器太过于笨重,往往不能满足我们实际业务的需求,这时候我们就需要自定义正则转换器了。
那么我们怎么自定义正则转换器呢?
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以','为分隔符,划分字符串,最后返回浏览器一个列表 """
附上一张分析图供大家学习: