动态路由¶
- 如果该路由需要路径传参可以使用动态路由
- 一旦设置动态路由, 视图中必须设置同名的关键词参数来接受路由中的变量
- 动态路由中的<> 就是一个正则转换器, 默认是转为 str 类型
from flask import Flask
app = Flask(__name__)
# 设置动态路由
@app.route('/user/<userid>')
def users(userid):
return '您请求的用户是:{}, 请求的类型是:任意'.format(userid)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000)
正则转换器¶
- 动态路由可以在传参时使用正则转换器对参数进行正则校验
- 所有的正则转换器,都继承自BaseConverter
- 正则转换器在接受参数的时候就开始校验数据类型是否符合规范,否则直接404
- Flask也提供了其他的转换器
- 'default': UnicodeConverter,
- 'string': UnicodeConverter,
- 'any': AnyConverter,
- 'path': PathConverter,
- 'int': IntegerConverter,
- 'float': FloatConverter,
- 'uuid': UUIDConverter,
-
源码中会把整个数据类型(str, int, float)赋值给类属性, 类属性self.num_convert有了数据类型的所有的属性之后 可以直接使用类属性进行强转, self.num_convert(value)
-
demo
@app.route('/user/<int:userid>') # 定义一个路由, 客户端访问时, 请求路径中的关键字参数, 必须能转成int类型
def user(userid):
return '您请求的用户是:{}, 请求的类型必须是int类型'.format(userid)
自定义正则转换器¶
- 自定义的正则转换器正则中不能使用^ 开头 因为flask会自动帮我们构建
- 自定义一个转换器必须继承BaseConverter的类
- 需要设置设置类属性
regex
来接收匹配规则 - 自定义的转换器需要注册到路由中
app.url_map.converters['key'] = value
,内部是个字典,直接kv设置就ok
#导入
from werkzeug.routing import BaseConverter
# 自定义一个转换器
class MobleConverter(BaseConverter):
regex = '1[3-9]\d{9}' # 规则
# 注册转换器到本应用中
app.url_map.converters['mob'] = MobleConverter
# 使用我们自定义的转换器来生成路由
# 使用自定义的正则转换器 生成路由
@app.route('/mobles/<mob:mob_id>')
def moble_info(mob_id):
return '您的手机号是{}'.format(mob_id)