前言
- 前面几篇文章讲的路由路径(rule)都是固定的,就是一个路径和一个视图函数绑定,当访问这条路径时会触发相应的处理函数
- 这样无法处理复杂的情况,比如常见的一个课程分类下有很多个课程,那么他们的 path 可能是 /course/class_1,/course/class_2,/course/class_3…仅最后的序号不同,其他部分都是相同的,如果每一条 path 都写一个单独的视图函数来处理,那复用性会很差,代码量也会很多
- 所以咱们要使用动态路由,路由中的路径是一个包含有参数的模板,这样就可以匹配多条路径
静态路由的栗子
网站中有 3 个用户 tom、jerry、mike,提供了 3 个路由访问这 3 个用户的信息
路由视图函数/user/tomshow_user_tom()/user/jerryshow_user_jerry()/user/mikeshow_user_mike()
from flask import Flask
app = Flask(__name__)
@app.route('/user/tom')
def show_user_tom():
return 'My name is tom'
@app.route('/user/jerry')
def show_user_jerry():
return 'My name is jerry'
@app.route('/user/mike')
def show_user_mike():
return 'My name is mike'
if __name__ == '__main__':
app.run()
静态路由存在的问题
三个视图函数的功能逻辑是相同的,存在明显的逻辑代码重复
动态路由
Flask 中动态路由是指带有参数的页面路径,大概格式如下
/prefix/<参数></参数>
它是一个模板,可以匹配多条路径,将参数放置在符号 < > 之间
将上面的静态路由栗子优化成动态路由
from flask import Flask
app = Flask(__name__)
@app.route('/user/<name>')
def show_user(name):
return 'My name is %s' % name
if __name__ == '__main__':
app.run()</name>
- 匹配所有以 /user/ 开头的路径
- 视图函数 show_user 有一个参数 name
- 假设实际的路径是 /user/poloyy,那么会与 /user/
实际请求结果
转换器
在 Flask 中,动态路由的参数类型默认是 string,但是也可以指定其他类型,比如数字 int 等
类型说明string默认,可以不用写int整数float同 int,但是仅接受浮点数path和 string 相似,但接受斜线
转换器的栗子代码
from flask import Flask
app = Flask(__name__)
@app.route('/user/<name>')
def show_user(name):
return 'My name is %s' % 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
if __name__ == '__main__':
app.run()</path:name></float:price></int:age></name>
上述代码定义了四条动态路由
动态路由参数类型参数视图函数/user/
/user/
直接看上面的栗子截图就好了,这里给一个踩坑的栗子
如果
/age/
传整数
传浮点点数
会直接报 404 哦!
/price/
传浮点数
传整数
会直接报 404 哦!
/path/
包含 / 的时候也可以正常请求
没有 / 的时候,和 string 类型一样
一个动态路由包含多个参数
@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}"</float:price></int:age></string:name></path:path>
postman 发起请求的结果
总结
Original: https://blog.csdn.net/qq_33801641/article/details/118649798
Author: 小菠萝测试笔记
Title: Flask(5)- 动态路由
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/749953/
转载文章受原作者版权保护。转载请注明原作者出处!