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 的 MapRule

2.最基础的路由写法

2.1使用 @app.route()

最常见写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
return 'Hello Flask'

@app.route('/login')
def login():
return 'Login Page'

if __name__ == '__main__':
app.run(debug=True)

含义:

  • @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
@app.route(rule, **options)

常见参数:

  • rule:URL 规则
  • methods:允许的 HTTP 方法
  • endpoint:路由终点名称
  • strict_slashes:是否严格区分末尾斜杠
  • defaults:默认参数

3.2methods 参数

默认情况下,route() 主要响应 GET 请求。

1
2
3
@app.route('/submit', methods=['GET', 'POST'])
def submit():
return 'submit ok'

说明:

  • GET:通常用于查询
  • POST:通常用于提交数据
  • PUT:通常用于更新
  • DELETE:通常用于删除

如果请求方法不在允许范围内,会返回:

  • 405 Method Not Allowed

示例:

1
2
3
@app.route('/user', methods=['GET'])
def get_user():
return 'user info'

此时如果你用 POST /user,就会报 405。


3.3endpoint 参数

endpoint 是 Flask 内部给路由定义的“名字”。

1
2
3
@app.route('/index', endpoint='home_page')
def index():
return 'home'

之后可以通过 url_for('home_page') 反向生成 URL。

默认情况下:

  • endpoint 默认等于 视图函数名

例如:

1
2
3
@app.route('/hello')
def hello():
return 'hello'

默认 endpoint 就是:

1
hello

3.4strict_slashes 参数

控制是否严格区分结尾斜杠。

1
2
3
@app.route('/test/', strict_slashes=False)
def test():
return 'test'

效果:

  • /test
  • /test/

都能访问。

如果严格模式开启,可能出现自动跳转或 404,具体取决于定义方式。


3.5defaults 参数

给动态参数设置默认值。

1
2
3
4
@app.route('/page/', defaults={'num': 1})
@app.route('/page/<int:num>')
def page(num):
return f'page={num}'

访问效果:

  • /page/num=1
  • /page/2num=2

4.动态路由详解

动态路由就是 URL 中某一段不是固定值,而是变量。

4.1基础动态参数

1
2
3
@app.route('/user/<name>')
def user(name):
return f'Hello {name}'

访问:

1
/user/gaga

得到:

1
Hello gaga

这里 <name> 会被 Flask 捕获,并作为参数传给 user(name)


4.2多参数动态路由

1
2
3
@app.route('/article/<category>/<int:id>')
def article(category, id):
return f'category={category}, id={id}'

访问:

1
/article/python/100

结果:

1
category=python, id=100

4.3路由转换器

Flask 支持多种内置转换器,用于约束参数类型。

常见转换器如下:

转换器 说明
string 默认,匹配不含 / 的字符串
int 整数
float 浮点数
path 可包含 / 的路径
uuid UUID 格式
any 限定为给定选项之一

示例:

1
2
3
@app.route('/order/<int:order_id>')
def order(order_id):
return f'order_id={order_id}'

只有整数能匹配成功。


4.4path 转换器

适合文件路径、目录层级这类场景。

1
2
3
@app.route('/files/<path:filename>')
def files(filename):
return f'filename={filename}'

访问:

1
/files/a/b/c.txt

得到:

1
filename=a/b/c.txt

如果用默认 string,则无法匹配多级路径。


4.5any 转换器

1
2
3
@app.route('/status/<any(open,close,pending):state>')
def status(state):
return f'state={state}'

只允许:

  • /status/open
  • /status/close
  • /status/pending

其他值不匹配,返回 404。


5.请求方法与路由关系

5.1同一路径支持不同方法

一个 URL 可以根据不同 HTTP 方法执行不同逻辑。

1
2
3
4
5
6
7
8
from flask import request

@app.route('/account', methods=['GET', 'POST'])
def account():
if request.method == 'GET':
return '查询账户信息'
elif request.method == 'POST':
return '创建账户'

这是一种常见写法,但当逻辑复杂时,可读性会下降。


5.2使用 app.get()app.post() 简化

新式写法更清晰:

1
2
3
4
5
6
7
@app.get('/items')
def get_items():
return 'GET items'

@app.post('/items')
def create_item():
return 'POST items'

优点:

  • 语义明确
  • 方法和业务逻辑更分离
  • 更适合 RESTful 风格

6.视图函数与 endpoint 的关系

6.1什么是视图函数

视图函数就是处理请求的 Python 函数:

1
2
3
@app.route('/hello')
def hello():
return 'hello world'

这里:

  • 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
2
3
from flask import url_for

url_for('hello')

返回:

1
/hello