一、前言
参考https://www.cnblogs.com/poloyy/p/14994738.html
- 前面几篇文章讲的路由路径都是固定的,就是一个路径和一个视图函数绑定,当访问这条路径时会触发相应的处理函数
- 这样无法处理复杂的情况,比如常见的一个课程分类下有很多个课程,那么他们的 path 可能是 /course/class_1,/course/class_2,/course/class_3...仅最后的序号不同,其他部分都是相同的,如果每一条 path 都写一个单独的视图函数来处理,那复用性会很差,代码量也会很多
- 所以咱们要使用动态路由,路由中的路径是一个包含有参数的模板,这样就可以匹配多条路径
二、静态路由
静态路由的例子,静态路由存在的问题:三个视图函数的功能逻辑是相同的,存在明显的逻辑代码重复
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()
三、动态路由
1、动态路由说明
Flask 中动态路由是指带有参数的页面路径,大概格式如下:/prefix/<参数> ,它是一个模板,可以匹配多条路径,将参数放置在符号 < > 之间
2、将上面静态路由优化成动态路由
from flask import Flask,request app = Flask(__name__) @app.route('/user/<name>') def show_user(name): # Python 中的'%s'%用法:一种字符串格式化的语法, 基本用法是将值插入到%s占位符的字符串中 # %s,表示格式化一个对象为字符,%(取代s的字符串) return '我的名字是:%s' % name if __name__ == '__main__': app.run()
- 匹配所有以 /user/ 开头的路径
- 视图函数 show_user 有一个参数 name
- 假设实际的路径是 /user/张三,那么会与 /user/<name> 匹配成功,并且将张三 存储到参数 name 中
3、转换器
在 Flask 中,动态路由的参数类型默认是 string,但是也可以指定其他类型,比如数字 int 等
以下代码定义了四条动态路由:
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()
/age/<int:age> postman 发起请求的结果
注:一个动态路由可以包含多个参数
@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}"
四、Flask 的 Debug 模式
1、Flask 程序可以运行在 Debug 模式下,Debug 模式提供了如下功能:
1)当 Flask 程序出现错误时,在浏览器中提示错误的详细信息
2)修改 Flask 程序代码后,Flask 程序会自动重新加载,不需要重启 Flask 程序,即可在浏览器中看到修改后的效果