正则自定义转换器
为什么要自定义正则转换器?
因为默认转换器太过于笨重,往往不能满足我们实际业务的需求,这时候我们就需要自定义正则转换器了。
那么我们怎么自定义正则转换器呢?
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也是一样的道理,都是进行数据的处理,从而达到我们需求。
(还有不明白的可以下方留言,大家一起探讨↓↓↓↓↓↓)