Flask路由详解
Flask 路由本质上是:把某个 URL 规则映射到某个视图函数上,当客户端发起 HTTP 请求时,Flask 根据请求的 路径、请求方法、参数规则 找到对应函数执行,再把结果返回给客户端。
可以理解为:
- URL:外部访问入口
- 路由规则:匹配条件
- 视图函数:实际处理逻辑
- 路由表:Flask 内部维护的映射关系
1.路由的核心作用
1.1为什么需要路由
Web 应用一定会面对多个访问入口,例如:
//login/user/1/article/202/api/order/list
如果没有路由机制,服务端就无法知道:
- 哪个 URL 该由哪个函数处理
- 哪种 HTTP 方法该允许访问
- 动态路径参数如何传递给业务代码
所以,路由就是 Web 框架最核心的入口分发机制。
1.2Flask 路由的特点
Flask 路由有几个典型特点:
- 语法简单
- 基于装饰器声明
- 支持动态参数
- 支持方法限制
- 支持蓝图模块化管理
- 底层依赖 Werkzeug 的
Map和Rule
2.最基础的路由写法
2.1使用 @app.route()
最常见写法:
1 | from flask import Flask |
含义:
@app.route('/')表示:当访问根路径/时执行index@app.route('/login')表示:当访问/login时执行login
2.2执行流程
请求到达 Flask 后,大致流程如下:
flowchart TD
A[客户端发起HTTP请求] --> B[Flask接收请求]
B --> C[匹配URL规则]
C --> D{是否找到匹配路由}
D -- 是 --> E[执行对应视图函数]
E --> F[生成响应对象]
F --> G[返回给客户端]
D -- 否 --> H[返回404 Not Found]
3.@app.route() 的常用参数
3.1基本语法
1 |
常见参数:
rule:URL 规则methods:允许的 HTTP 方法endpoint:路由终点名称strict_slashes:是否严格区分末尾斜杠defaults:默认参数
3.2methods 参数
默认情况下,route() 主要响应 GET 请求。
1 |
|
说明:
GET:通常用于查询POST:通常用于提交数据PUT:通常用于更新DELETE:通常用于删除
如果请求方法不在允许范围内,会返回:
- 405 Method Not Allowed
示例:
1 |
|
此时如果你用 POST /user,就会报 405。
3.3endpoint 参数
endpoint 是 Flask 内部给路由定义的“名字”。
1 |
|
之后可以通过 url_for('home_page') 反向生成 URL。
默认情况下:
- endpoint 默认等于 视图函数名
例如:
1 |
|
默认 endpoint 就是:
1 | hello |
3.4strict_slashes 参数
控制是否严格区分结尾斜杠。
1 |
|
效果:
/test/test/
都能访问。
如果严格模式开启,可能出现自动跳转或 404,具体取决于定义方式。
3.5defaults 参数
给动态参数设置默认值。
1 |
|
访问效果:
/page/→num=1/page/2→num=2
4.动态路由详解
动态路由就是 URL 中某一段不是固定值,而是变量。
4.1基础动态参数
1 |
|
访问:
1 | /user/gaga |
得到:
1 | Hello gaga |
这里 <name> 会被 Flask 捕获,并作为参数传给 user(name)。
4.2多参数动态路由
1 |
|
访问:
1 | /article/python/100 |
结果:
1 | category=python, id=100 |
4.3路由转换器
Flask 支持多种内置转换器,用于约束参数类型。
常见转换器如下:
| 转换器 | 说明 |
|---|---|
string |
默认,匹配不含 / 的字符串 |
int |
整数 |
float |
浮点数 |
path |
可包含 / 的路径 |
uuid |
UUID 格式 |
any |
限定为给定选项之一 |
示例:
1 |
|
只有整数能匹配成功。
4.4path 转换器
适合文件路径、目录层级这类场景。
1 |
|
访问:
1 | /files/a/b/c.txt |
得到:
1 | filename=a/b/c.txt |
如果用默认 string,则无法匹配多级路径。
4.5any 转换器
1 |
|
只允许:
/status/open/status/close/status/pending
其他值不匹配,返回 404。
5.请求方法与路由关系
5.1同一路径支持不同方法
一个 URL 可以根据不同 HTTP 方法执行不同逻辑。
1 | from flask import request |
这是一种常见写法,但当逻辑复杂时,可读性会下降。
5.2使用 app.get()、app.post() 简化
新式写法更清晰:
1 |
|
优点:
- 语义明确
- 方法和业务逻辑更分离
- 更适合 RESTful 风格
6.视图函数与 endpoint 的关系
6.1什么是视图函数
视图函数就是处理请求的 Python 函数:
1 |
|
这里:
- URL:
/hello - endpoint:
hello - 视图函数:
hello()
6.2endpoint 的本质
Flask 内部路由映射并不是直接用 URL 找函数,而是:
URL Rule → endpoint → view function
大致可以理解成:
flowchart LR
A[URL规则] --> B[endpoint]
B --> C[视图函数]
这意味着 endpoint 是中间层标识符。
因此你会看到 url_for() 不是写路径,而是写 endpoint:
1 | from flask import url_for |
返回:
1 | /hello |