阅读 182

Flask(5)- 动态路由

前言

  • 前面几篇文章讲的路由路径(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 Flaskapp = 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 Flaskapp = Flask(__name__)@app.route('/user/<name>')def show_user(name):    return 'My name is %s' % nameif __name__ == '__main__':    app.run()

  • 匹配所有以 /user/ 开头的路径

  • 视图函数 show_user 有一个参数 name

  • 假设实际的路径是 /user/poloyy,那么会与 /user/<name> 匹配成功,并且将 poloyy 存储到参数 name 中

 

实际请求结果

 

转换器

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

类型说明
string默认,可以不用写
int整数
float同 int,但是仅接受浮点数
path和 string 相似,但接受斜线

 

转换器的栗子代码

from flask import Flaskapp = 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' % nameif __name__ == '__main__':    app.run()

 

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

动态路由参数类型参数视图函数
/user/<name>字符串nameshow_user
/age/<int:age>intageshow_age
/price/<float:price>floatpriceshow_price
/path/<path:name>pathnameshow_path

 

/user/<name> postman 发起请求的结果

直接看上面的栗子截图就好了,这里给一个踩坑的栗子

如果 <name> 传了包含 / 的话,会报 404 哦

 

/age/<int:age> postman 发起请求的结果

传整数

 

传浮点点数

会直接报 404 哦! 

 

/price/<float:price> postman 发起请求的结果

传浮点数

  

传整数

会直接报 404 哦!

 

/path/<path:name> postman 发起请求的结果

包含 / 的时候也可以正常请求

 

没有 / 的时候,和 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}"

 

postman 发起请求的结果

 

总结


__EOF__

  • 本文作者: 小菠萝测试笔记

  • 本文链接: https://www.cnblogs.com/poloyy/p/14994738.html


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐