Flask 自定义转化器
#非重点 #1 写类,继承BaseConverter #2 注册:app.url_map.converters['regex'] = RegexConverter #3 使用:@app.route('/index/<regex("\d+"):nid>') 正则表达式会当作第二个参数传递到类中 from flask import Flask, url_for from werkzeug.routing import BaseConverter app = Flask(import_name=__name__) class RegexConverter(BaseConverter): """ 自定义URL匹配正则表达式 """ def __init__(self, map, regex): super(RegexConverter, self).__init__(map) self.regex = regex def to_python(self, value): """ 路由匹配时,匹配成功后传递给视图函数中参数的值 """ print("to_python",value,type(value)) return int(value)+1 def to_url(self, value): """ 使用url_for反向生成URL时,传递的参数经过该方法处理,返回的值用于生成URL中的参数 """ val = super(RegexConverter, self).to_url(value) return val+"222" # 添加到flask中 app.url_map.converters['regex'] = RegexConverter # 正则匹配处理结果,要交给to_python,to_python函数可以对匹配处理结果做处理 @app.route('/index/<regex("\d+"):nid>') def index(nid): print("index",nid,type(nid)) print(url_for('index', nid='888')) return 'Index' if __name__ == '__main__': app.run()
总结:
1、导入from werkzeug.routing import BaseConverter 2、写一个类继承BaseConverter。实现3个方法,def __init__ , def to_python , def to_url 3、将上面的类注册到app.url_map.converters['regex'] = RegexConverter中 4、然后就可以在路由转化器中使用3中的regex("传正则") 5、当路由被访问以后。regex("传正则")会匹配结果,把结果传递to_python,我们可以进行再次处理,to_python处理好的结果,会传递给响应函数的形参 6、当用url做反向解析的时候,传递给路由转化器的参数,会经过to_url,进行处理。处理以后,在拼接到路由。