转换器,顾名思义,是进行类型转换的。
首先,我们通过打印app中的converters可以看到,Flask内置的转换器有如下:
print('converters:', app.url_map.converters)
converters: {
'default': <class 'werkzeug.routing.UnicodeConverter'>,
'string': <class 'werkzeug.routing.UnicodeConverter'>,
'any': <class 'werkzeug.routing.AnyConverter'>,
'path': <class 'werkzeug.routing.PathConverter'>,
'int': <class 'werkzeug.routing.IntegerConverter'>,
'float': <class 'werkzeug.routing.FloatConverter'>,
'uuid': <class 'werkzeug.routing.UUIDConverter'>
}
也就是说,我们在写路由时,这上面几种类型的是可以随意转换的,比如:
@app.route('fruits/<id>')
def get_fruit(id):
print(id,type(id))
return 'Fruit page!'
这里打印结果是
可以看出,我们路由中传入的1,是字符串类型,并非int;倘若非要用int类型,那么这时就可以使用转换器解决。
上段代码的路由可以改为:
@app.route('fruits/<int:id>')
打印结果:1 <class 'int'>
补充:int:接收正整数; string: 接受任何不包含‘/’的文本; float:接收正浮点数; path:接收包含‘/’的文本。
另外,我们还会遇到再路由中验证手机号/邮箱等业务,这种情况下需要使用正则来自定义转换器。
第一步:导包
自定转换器集成自werkzeug.routing中的BaseConverter类
from werkzeug.routing import BaseConverter
第二步:编写自定义函数
class RegexConverter(BaseConverter):
'''自定义转换器'''
regex = '1\d{10}'
def __init__(self, url_map):
#调用父类方法
super(RegexConverter, self).__init__(url_map)
def to_python(self, value):
#父类方法已实现好了
return value
这里可以参考BaseConverter类中其他转换器来仿写。
要验证手机号或者是邮箱,主要是写正则匹配。
第三步:把自定义转换器添加到转换器中
我们要想使用自定义转换器,需要把我们自定义的类加入到app.url_map.converters中才可以使用。
app.url_map.converters['phone'] = RegexConverter # {'phone' : RegexConverter}
这里,可以print一下app中的converters,发现自定义的转换器成功添加到了converters中。
第四步:写路由
@app.route('/convert/<phone:value>')
def convert(value):
return '恭喜手机号为{}的用户,学会了自定义转换器'.format(value)