Flask(5)- 动态路由

简介: Flask(5)- 动态路由

前言


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

 

静态路由的栗子


网站中有 3 个用户 tom、jerry、mike,提供了 3 个路由访问这 3 个用户的信息

路由 视图函数
/user/tom show_user_tom()
/user/jerry show_user_jerry()
/user/mike show_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()


  • 匹配所有以 /user/ 开头的路径
  • 视图函数 show_user 有一个参数 name
  • 假设实际的路径是 /user/poloyy,那么会与 /user/<name> 匹配成功,并且将 poloyy 存储到参数 name 中

 

实际请求结果

image.png

转换器


在 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()


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

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

 

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

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

image.png

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

 

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

传整数

image.png

会直接报 404 哦!

 

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

传浮点数

image.png

会直接报 404 哦!

 

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

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

image.png

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


@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 发起请求的结果

image.png


总结


image.png

相关文章
|
30天前
|
移动开发 JavaScript 前端开发
Flask 结合 Highcharts 实现动态渲染图表
Flask 结合 Highcharts 实现动态渲染图表
|
30天前
|
网络架构 Python
Flask的路由讲解
Flask的路由讲解
20 0
|
10天前
|
API 网络架构 开发者
Flask Web开发基础【路由和Jinja2模板引擎】
# Flask Web开发基础 Flask是轻量级Web框架,专注于核心功能:请求响应、模板渲染和URL路由。本文档介绍了使用Flask的基础知识,包括命令行和Python两种运行模式,以及如何修改入口文件、端口和地址。此外,还讨论了URL路由的概念和其在Flask中的实现,展示了动态路由和多URL绑定的例子。最后,提到了Jinja2模板引擎,解释了其基本语法,并通过电影列表案例展示了如何结合Flask使用模板。
28 1
|
30天前
|
网络架构 Python
在Flask中,如何定义路由并处理HTTP请求的不同方法(GET、POST等)?
【4月更文挑战第25天】在Flask中,使用`@app.route()`装饰器定义路由,如`/hello`,处理GET请求返回&#39;Hello, World!&#39;。通过添加`methods`参数,可处理不同HTTP方法,如POST请求。单一函数可处理多种方法,通过检查`request.method`区分。动态路由使用 `&lt;variable_name&gt;` 传递URL变量到视图函数。这些基础构成处理HTTP请求的Flask应用。
38 1
|
30天前
|
JSON 数据格式 Python
如何在Flask框架中定义路由和处理请求?
【4月更文挑战第18天】在Flask框架中,创建应用实例、定义路由和处理请求涉及5个步骤:1) 导入Flask并实例化应用;2) 使用`app.route()`装饰器定义路由,指定URL和HTTP方法;3) 编写视图函数处理请求逻辑;4) 视图函数返回响应内容,Flask会自动转换格式;5) 用`app.run()`启动服务器。
42 3
|
30天前
|
开发框架 中间件 网络架构
Flask路由机制深度剖析
【4月更文挑战第15天】Flask是一款轻量级Web框架,其路由机制是核心功能之一,负责将URL映射到处理函数。路由通过`@app.route()`装饰器定义,如`@app.route(&#39;/&#39;)`将根URL映射到`index`函数。动态路由如`/user/&lt;username&gt;`允许传入变量,支持`methods`、`defaults`和`strict_slashes`等参数定制行为。Flask还提供多种路由转换器(如`int`、`float`)确保URL参数类型。`url_for()`函数用于动态构建URL。理解这些机制有助于高效构建和扩展Flask Web应用。
|
30天前
|
网络架构 Python
Flask路由与视图:构建你的第一个Web应用
【4月更文挑战第15天】Flask是Python的Web框架,其核心是路由和视图。路由通过`@app.route()`装饰器定义,将URL映射到视图函数。视图函数处理请求并返回响应。动态路由允许URL包含可变部分,如`&lt;username&gt;`,将参数传递给函数。本文通过示例展示了如何创建显示待办事项列表的Web应用,包括定义路由、视图、使用模板以及运行应用。这为基础的Flask应用开发提供了基础。
|
30天前
|
测试技术 Apache 项目管理
软件测试|探索Flask接口路由技术:构建灵活可拓展的Python应用
软件测试|探索Flask接口路由技术:构建灵活可拓展的Python应用
32 1
|
6月前
|
监控 前端开发 UED
Flask SocketIO 实现动态绘图
Flask-SocketIO 是基于 Flask 的一个扩展,用于简化在 Flask 应用中集成 WebSocket 功能。WebSocket 是一种在客户端和服务器之间实现实时双向通信的协议,常用于实现实时性要求较高的应用,如聊天应用、实时通知等,使得开发者可以更轻松地构建实时性要求较高的应用。通过定义事件处理函数,可以实现双向实时通信,为应用提供更加丰富和实时的用户体验。
41 0
Flask SocketIO 实现动态绘图
|
8月前
|
存储 测试技术 网络架构
软件测试|测试平台开发-Flask入门:Flask动态路由
软件测试|测试平台开发-Flask入门:Flask动态路由
42 0