六:flask-自定义URL转换器
flask进行url参数匹配的时候,是继承的werkzeug.routing.BaseConverter库进行重写的
导入看源码
里面有所有的URL参数数据类型的判断
也就是说,可以继承过后实现自己的需求,即自定义url转换器比如:
url中,接收一个参数,限制此参数必须满足手机号格式
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
class PhoneConveter(BaseConverter):
""" 校验手机号 """
# BaseConverter下是使用regex来指定规则
regex = r'1[85734]\d{9}' # 第一位为1,第二位为85734之一,\d为数字,{9}指9位
app.url_map.converters['phone'] = PhoneConveter # 把自定义的规则加到url匹配规则中
# 接收一个参数,限制此参数必须满足手机号格式
@app.route('/phone/<phone:phone_num>/')
def phone(phone_num):
return f'接收到的手机号码为:{phone_num}'
to_python()方法,此方法的返回值,会自动传给使用到当前url转换规则的视图函数
如:在接口后面加参数a+b,则返回a的资源和b的资源
正常情况下应该是把接收到的参数根据 “+” 号进行切片,然后分别获取对应数据再返回,但是这个方法需要每个视图函数里面都要进行一次切片,如果这样的url参数非常多的话,就很麻烦
如果使用自定义url转换器的话,可以直接接收到就参数就转换成list传给视图函数处理,在BaseConverter下有个 to_python()方法,此方法的返回值,会自动传给使用到当前url转换规则的视图函数
class ListConveter(BaseConverter):
def to_python(self, value):
return value.split('+')
app.url_map.converters['list'] = ListConveter # 把自定义的规则加到url匹配规则中
# 在接口后面加参数a+b,则返回a的资源和b的资源
@app.route('/posts/<list:boards>/')
def posts_(boards):
return f'资源a:{boards[0]}, 资源b:{boards[1]}'
to_url()方法,正好和to_python()方法相反,是在url_for()构建url的时候,将参数处理后再组成url
如,在构建url的时候,传入一个list,构建后的url为:url/list[0]+list[1]
class ListConveter(BaseConverter):
def to_python(self, value):
return value.split('+')
def to_url(self, value):
print(f'value: {value}')
return '+'.join(value)
app.url_map.converters['list'] = ListConveter # 把自定义的规则加到url匹配规则中
@app.route('/')
def hello_world():
a = url_for('posts_', boards=['a', 'b'])
print(f'a: {a}')
return a
# 在接口后面加参数a+b,则返回a的资源和b的资源
@app.route('/posts/<list:boards>/')
def posts_(boards):
return f'资源a:{boards[0]}, 资源b:{boards[1]}'
讨论群:249728408