Flask-5:动态路由


Flask-5:动态路由

一、前言

  • 前面几篇文章讲的路由路径(rule)都是固定的,就是一个路径和一个视图函数绑定,当访问这条路径时会触发响应的处理函数;
  • 这样无法处理复杂的情况,比如常见的一个课程分类下有很多个课程,那么他们的path可能是/course/class_1,/course/class_2,/course/class_3,...仅最后的序号不同,其他部分都是相同的,如果每一条path都写一个单独的视图函数来处理,那样复用性会很差,代码量也会很多;
  • 所以咱们要是用动态路由,路由中的路径是一个包含有参数的模板,这样就可以匹配多条路径。

二、静态路由的栗子

网站中有三个用户a,b,c,提供了3个路由访问这3个用户的信息

路由 视图函数
/user/a show_user_a()
/user/b show_user_b()
/user/c show_user_c()
from flask import Flask
app = Flask(__name__)
@app.route('/user/a')
def show_user_a():
    return 'My name is a'
@app.route('/user/b')
def show_user_b():
    return 'My name is b'
@app.route('/user/c')
def show_user_c():
    return 'My name is c'
if __name__ == '__main__':
    app.run()

静态路由存在的问题

三个视图函数的功能逻辑是相同的,存在明显的逻辑代码重复

三、动态路由

Flask中动态路由是指带有参数的页面路径,大概格式:/prefix/<参数>,他是一个模板,可以匹配多条路径,将参数放置在符号<>之间。

将上面的静态路由栗子优化成动态路由

@app.route('/user/<name>')
def show_user(name):
    return 'My name is {0}'.format(name)
  • 匹配所有以/user/开头的路径;
  • 视图函数show_user有一个参数name;
  • 假设实际路径是/user/x,那么与/user/匹配成功,并且将x存储到参数name中。

实际请求结果

四、转换器

在Flask中,动态路由的参数类型默认是string,但也可以指定其他类型,比如数字int等

类型 说明
string 默认,可以不用写
int 整数
float 仅接收浮点数
path 和string相似,但是接受斜线
@app.route('/user/<name>')
def show_user(name):
    return 'My name is {0}'.format(name)
@app.route('/age/<int:age>')
def show_age(age):
    return 'age is %d' % age
@app.route('/price/<float:price>')
def show_price(price):
    return 'price is %f' % price
@app.route('/path/<path:name>')
def show_path(name):
    return 'path is %s' % name

上述代码定义了四条动态路由

动态路由 参数类型 参数 视图函数
/user/ string name show_user()
/age/<int:age> int age show_age()
/price/<float:price> float price show_price()
/path/<path:name> path name show_path()

请求结果

如果传了包含/的话,会报404

/user/上面有就不截图了

/age/int:age

/price/float:price

传递整数(会报404)

传递浮点

/path/path:name

不包含/和字符串一样

包含/也可以正常请求

一个动态路由包含多个参数

@app.route('/all/<path:path>/name/<string:name>/age/<int:age>/price/<float:price>')
def show_all(name, path, age, price):
    return f"path is {path}\nname is {name}\nage is {age}\nprice is {price}"

请求


文章作者: 刘宇亭
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 刘宇亭 !
评论
  目录