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 数据。
  • 常用方法:GETPOSTPUTDELETEPATCH
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 路由指南。

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注