在flask默认的路由匹配规则中,一个动态的路由可以匹配int,float,path三种类型
例如:
# 匹配path的情况
@app.route('/user/<username>')
def user(username)
# 匹配int的情况
@app.route('/user/<int:user_id>')
def user(user_id)
# 匹配float的情况
@app.route('/user/<float:user_weight>')
def user(user_weight)
而在某些特定的需求下,需要动态匹配一些有特殊要求的字符,这就可以考虑用正则表达式的方式传入
具体的实现步骤如下:
1.导入转换器基类:在Flask中,所有的路由的匹配规则都是使用转换器对象进行记录
from werkzeug.routing import BaseConverter
2.自定义转换器:自定义类继承于转换器基类
# 自定义正则转换器
class RegexConverter(BaseConverter):
def __init__(self, url_map, *args):
super(RegexConverter, self).__init__(url_map)
# 将接收的第1个参数当作匹配规则进行保存
self.regex = args[0]
3.添加转换器到默认的转换字典中,并指定转换器使用时的名字为:re
app = Flask(__name__)
# 将自定义转换器添加到转换器字典中,并且指定转换器使用时的名字为:re
app.url_map.converter['re'] = RegexConverter
4.使用转换器去实现自定义匹配规则,当前此处定义的规则是:3位数字
@app.route('/user/<re("[0-9]{3}"):user_id>')
def user_info(user_id):
return "user_id 为 %s" % user_id
系统自带转换器:
DEFAULT_CONVERTERS = {
'default': UnicodeConverter,
'string': UnicodeConverter,
'any': AnyConverter,
'path': PathConverter,
'int': IntegerConverter,
'float': FloatConverter,
'uuid': UUIDConverter,
}