Flask 路由
直接回答
关键要点:
Flask 的路由(Routing)是将 URL 映射到视图函数的机制,使用 @app.route()
装饰器定义,负责处理客户端请求并返回响应。以下是 Flask 路由的核心概念和用法:
- 基本路由:将 URL 路径绑定到视图函数。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Hello, World!'
- 动态路由:支持 URL 中动态参数(如
<name>
)。
@app.route('/user/<username>')
def user_profile(username):
return f'Hello, {username}!'
- HTTP 方法:支持 GET、POST 等,指定
methods
参数。
@app.route('/submit', methods=['GET', 'POST'])
def submit():
if request.method == 'POST':
return 'Form submitted!'
return 'Show form'
- URL 构建:使用
url_for()
生成动态 URL。
from flask import url_for
@app.route('/test')
def test():
return url_for('user_profile', username='Alice') # 输出: /user/Alice
注意事项:
- 动态参数支持类型约束(如
<int:id>
)。 - 使用蓝图(Blueprint)模块化路由,适合大型项目。
- 生产环境避免硬编码 URL,优先使用
url_for()
。
参考资源:
详细报告
Flask 的路由是框架的核心功能,用于将客户端的 HTTP 请求映射到特定的视图函数,处理请求并返回响应。路由通过 @app.route()
装饰器定义,支持静态路由、动态路由、HTTP 方法处理和 URL 构建等功能。本文详细讲解 Flask 路由的概念、用法、模块化设计及最佳实践,基于 2025 年 8 月 2 日的最新信息。
1. 什么是 Flask 路由?
路由(Routing)是 Flask 中将 URL 路径与视图函数关联的机制。客户端通过 URL 发送请求,Flask 根据路由规则调用对应的视图函数,生成响应(如 HTML、JSON 或重定向)。路由的核心功能包括:
- 定义 URL 路径与视图函数的映射。
- 处理动态 URL 参数。
- 支持多种 HTTP 请求方法(如 GET、POST)。
- 提供 URL 动态生成工具(如
url_for()
)。
2. 路由的基本用法
2.1 静态路由
静态路由将固定 URL 路径映射到视图函数。
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return 'Welcome to Flask!'
@app.route('/about')
def about():
return '<h1>About Page</h1>'
- 访问
http://127.0.0.1:5000/
显示主页,/about
显示关于页面。 @app.route()
定义路由,路径以/
开头。
2.2 动态路由
动态路由通过 URL 中的参数传递数据,支持变量规则。
@app.route('/user/<username>')
def user_profile(username):
return f'Hello, {username}!'
- 访问
http://127.0.0.1:5000/user/Alice
显示Hello, Alice!
。 <username>
是动态参数,传递给视图函数的username
参数。
支持的类型约束:
Flask 支持在动态路由中指定参数类型:
<string:name>
:字符串(默认)。<int:id>
:整数。<float:num>
:浮点数。<path:path>
:路径(包含斜杠)。<uuid:id>
:UUID 格式。
示例:
@app.route('/post/<int:post_id>')
def show_post(post_id):
return f'Post ID: {post_id}'
- 访问
/post/123
有效,/post/abc
返回 404。
2.3 HTTP 方法
Flask 路由支持多种 HTTP 方法,通过 methods
参数指定:
from flask import request
@app.route('/submit', methods=['GET', 'POST'])
def submit():
if request.method == 'POST':
data = request.form.get('data')
return f'Received: {data}'
return '''
<form method="post">
<input type="text" name="data">
<button type="submit">Submit</button>
</form>
'''
GET
:显示表单。POST
:处理表单提交,获取request.form
数据。- 常用方法:
GET
、POST
、PUT
、DELETE
、PATCH
。
2.4 URL 构建
url_for()
函数动态生成 URL,避免硬编码:
from flask import url_for
@app.route('/test')
def test():
url = url_for('user_profile', username='Alice')
return f'Generated URL: {url}' # 输出: /user/Alice
url_for()
接受视图函数名和参数,生成对应的 URL。- 支持外部 URL(
url_for('endpoint', _external=True)
生成完整 URL,如http://domain/user/Alice
)。
3. 模块化路由:使用蓝图(Blueprint)
对于大型项目,路由分散在多个模块中,使用蓝图(Blueprint)实现模块化管理。蓝图将路由分组,提高代码可维护性。
示例(项目结构):
myproject/
├── app/
│ ├── __init__.py
│ ├── routes/
│ │ ├── __init__.py
│ │ ├── home.py
│ │ └── user.py
│ └── templates/
│ └── home.html
├── run.py
└── venv/
实现:
app/routes/home.py
:
from flask import Blueprint, render_template
bp = Blueprint('home', __name__)
@bp.route('/')
def index():
return render_template('home.html')
app/routes/user.py
:
from flask import Blueprint
bp = Blueprint('user', __name__, url_prefix='/user')
@bp.route('/<username>')
def profile(username):
return f'Hello, {username}!'
app/__init__.py
:
from flask import Flask
from app.routes import home, user
def create_app():
app = Flask(__name__)
app.config.from_object('app.config.Config')
app.register_blueprint(home.bp)
app.register_blueprint(user.bp)
return app
run.py
:
from app import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
效果:
/
访问主页(home.index
)。/user/Alice
访问用户页面(user.profile
)。- 蓝图的
url_prefix
自动为路由添加前缀(如/user
)。
4. 路由高级功能
4.1 默认参数
为动态参数设置默认值,使用 defaults
参数:
@app.route('/page/<int:num>', defaults={'num': 1})
def page(num):
return f'Page {num}'
- 访问
/page
默认使用num=1
。
4.2 重定向和错误处理
- 重定向:
from flask import redirect, url_for
@app.route('/old')
def old_route():
return redirect(url_for('home'))
- 自定义错误页面:
@app.errorhandler(404)
def not_found(error):
return 'Page not found', 404
4.3 路由正则表达式
Flask 本身不支持直接正则表达式,但可通过 Werkzeug 的 Rule
类实现:
from werkzeug.routing import Rule
app.url_map.add(Rule('/item/<string(length=3):code>', endpoint='item', methods=['GET']))
@app.endpoint('item')
def item(code):
return f'Item code: {code}'
- 匹配
/item/abc
,但/item/abcd
无效。
5. 最佳实践
- 使用蓝图:大型项目使用蓝图模块化路由,避免单一文件冗长。
- 动态 URL:优先使用
url_for()
生成 URL,避免硬编码。 - 方法限制:明确指定
methods
,防止意外处理(如 POST 到 GET 路由)。 - 参数验证:在动态路由中使用类型约束(如
<int:id>
),减少视图函数中的验证逻辑。 - 安全性:为 POST 请求启用 CSRF 保护(使用 Flask-WTF)。
6. 注意事项
- 调试模式:路由开发时启用
debug=True
,生产环境禁用。 - 路由冲突:避免定义重复的 URL 路径,Flask 会抛出异常。
- 性能:大量路由可能影响性能,合理使用蓝图和模块化设计。
- 生产部署:路由定义不变,但需使用 Gunicorn/uWSGI 和 Nginx(参考前文部署指南)。
7. 示例:综合路由应用
from flask import Flask, render_template, request, url_for, redirect
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
@app.route('/')
def home():
return render_template('home.html')
@app.route('/user/<int:id>')
def user(id):
return f'User ID: {id}'
@app.route('/form', methods=['GET', 'POST'])
def form():
if request.method == 'POST':
name = request.form.get('name')
return redirect(url_for('user', id=1))
return '''
<form method="post">
<input type="text" name="name">
<button type="submit">Submit</button>
</form>
'''
@app.errorhandler(404)
def not_found(error):
return '404: Page not found', 404
if __name__ == '__main__':
app.run(debug=True)
- 功能:主页、用户页面、表单提交和 404 错误处理。
- 模板(
templates/home.html
):
<html>
<body>
<h1>Welcome</h1>
<a href="{{ url_for('form') }}">Go to Form</a>
</body>
</html>
8. 参考资源
9. 结论
Flask 路由通过 @app.route()
提供简单而强大的 URL 映射机制,支持静态路由、动态参数、HTTP 方法和模块化设计(蓝图)。开发者可根据项目规模选择单文件路由或蓝图模块化,结合 url_for()
和类型约束提高代码健壮性。本指南基于 2025 年 8 月 2 日的最新实践,为初学者和开发者提供清晰的 Flask 路由指南。