前言
之前我们介绍了flask发送http请求,以及flaskURL的详解,我们使用的路由都是固定的,一个路径和一个视图函数绑定,当访问这条路径时会触发相应的处理函数。但是当我们要处理更为复杂的情况时,比如我们有多个用户,我们要访问这几个用户的个人信息,我们不可能为每一个用户设计一个固定的路由,这样会造成大量的重复代码,复用性也不强,因为我们就需要通过动态路由来实现我们的代码复用,减少重复的代码量。在本文中,我们将详细介绍Flask动态路由的使用方法和示例。
静态路由的缺点
假设我们有一个博客网站,我们希望根据不同的用户名称来展示不同用户的个人主页,如果我们使用静态路由来处理,代码如下:
from flask import Flask
app = Flask(__name__)
@app.route('/user/muller')
def show_user_muller():
return 'My name is muller'
@app.route('/user/salah')
def show_user_salah():
return 'My name is salah'
@app.route('/user/sicca')
def show_user_sicca():
return 'My name is sicca'
if __name__ == '__main__':
app.run()
上述的代码示例表示有三个用户muller,salah,sicca,提供了三个路由访问这三个用户的信息,如下表:
路由 | 视图函数 |
/user/muller | show_user_muller() |
/user/salah | show_user_salah() |
/user/sicca | show_user_sicca() |
我们可以很明显看出函数的实现逻辑是一样的,代码复用性很差。
动态路由
动态路由是指在Flask应用中,URL中的一部分可以作为参数传递给视图函数,从而使得我们可以根据URL中不同的部分来生成不同的响应。这样,我们就可以实现更加灵活和动态的Web应用。
动态路由大致格式如下:
/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()
- 匹配所有以 /user/ 开头的路径
- 视图函数 show_user 有一个参数 name
- 假设实际的路径是 /user/muller,那么会与 /user/ 匹配成功,并且将 muller 存储到参数 name 中
运行脚本,浏览器访问网址'http://127.0.0.1:5000/user/muller',结果如下图:
访问网址'http://127.0.0.1:5000/user/Messi',结果如下图:
动态路由转换器
在 Flask 中,动态路由的参数类型默认是 string,但是也可以指定其他类型,比如数字 int 浮点数 float等,如下表:
类型 | 说明 |
string | 默认,可以不用写 |
int | 整数 |
float | 浮点数 |
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()
我们可以通过浏览器访问不同的网址验证我们的动态路由是否成功创建。
多个参数的动态路由示例
一个动态路由也可以包含多个参数,如下:
@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}"
我们也可以通过浏览器访问网址来检验是否成功创建了该动态路由,比如'http://127.0.0.1:5000/all/user/name/muller/age/33/price/334.5'
总结
本文介绍了Flask动态路由的概念和用法。通过动态路由,我们可以根据URL中的不同部分来动态生成视图和响应内容,从而实现更加灵活和动态的Web应用。在实际应用中,可以根据需要传递不同的参数,以满足不同的业务需求。希望本文能够帮助你更好地理解和使用Flask中的动态路由功能。