Flask 路由与错误处理详细教程(第二阶段)

目录

  • [Flask 路由与错误处理详细教程](#Flask 路由与错误处理详细教程)
    • 第一部分:路由
      • [1.1 定义静态路由与动态路由](#1.1 定义静态路由与动态路由)
      • [1.2 使用路由转换器](#1.2 使用路由转换器)
      • [1.3 为路由添加 HTTP 方法](#1.3 为路由添加 HTTP 方法)
    • 第二部分:错误处理
      • [2.1 使用错误处理装饰器](#2.1 使用错误处理装饰器)
      • [2.2 自定义 404 页面和其他 HTTP 错误](#2.2 自定义 404 页面和其他 HTTP 错误)
      • [2.3 自定义其他 HTTP 错误页面](#2.3 自定义其他 HTTP 错误页面)
    • 第三部分:请求钩子与中间件
      • [3.1 请求前后钩子](#3.1 请求前后钩子)
      • [3.2 创建和使用中间件](#3.2 创建和使用中间件)
      • 示例小应用
    • 结论

Flask 路由与错误处理详细教程

Flask 是一个灵活且易于使用的 Web 框架,其核心功能之一是路由。路由决定了 URL 到视图函数的映射,了解如何使用路由、处理错误以及实现请求钩子是开发 Flask 应用程序的重要步骤。本教程将详细介绍 Flask 的路由、错误处理以及请求钩子和中间件。

第一部分:路由

1.1 定义静态路由与动态路由

静态路由定义了具体的 URL 路径,例如:

python 复制代码
from flask import Flask

app = Flask(__name__)

@app.route('/about')
def about():
    return "About Page"

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

访问 http://127.0.0.1:5000/about 将返回 "About Page"。

动态路由 允许 URL 中包含可变化的部分,例如用户 ID 或文章标题。动态路由使用尖括号 < > 来指定可变化的部分:

python 复制代码
@app.route('/user/<username>')
def show_user_profile(username):
    return f'User: {username}'

@app.route('/post/<int:post_id>')
def show_post(post_id):
    return f'Post ID: {post_id}'

在上述示例中,<username><int:post_id> 分别接受字符串和整数字符串作为参数。

1.2 使用路由转换器

Flask 提供多种路由转换器。你可以使用以下几种:

  • <int:variable>: 整数
  • <float:variable>: 浮点数
  • <path:variable>: 允许斜杠的字符串
  • <string:variable>: 默认字符串类型
python 复制代码
@app.route('/float/<float:value>')
def show_float(value):
    return f'Float Value: {value}'

1.3 为路由添加 HTTP 方法

Flask 允许你为路由指定 HTTP 方法,例如 GET、POST、PUT 和 DELETE。通过元组配置方法:

python 复制代码
@app.route('/submit', methods=['POST'])
def submit():
    # 处理POST请求
    return 'Form submitted!', 201

你可以在同一个路由中处理多个 HTTP 方法:

python 复制代码
@app.route('/data', methods=['GET', 'POST'])
def handle_data():
    if request.method == 'POST':
        return 'Data created', 201
    return 'Data fetched', 200

第二部分:错误处理

2.1 使用错误处理装饰器

Flask 提供了一个装饰器 @app.errorhandler() 用于处理错误。你可以为特定错误代码创建自定义处理函数:

python 复制代码
@app.errorhandler(404)
def page_not_found(e):
    return "This page does not exist.", 404

@app.errorhandler(500)
def internal_server_error(e):
    return "Internal server error.", 500

2.2 自定义 404 页面和其他 HTTP 错误

可以创建一个自定义的 404 页面:

python 复制代码
@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

templates 文件夹中创建一个 404.html 文件,自定义内容。

2.3 自定义其他 HTTP 错误页面

你也可以自定义其他 HTTP 错误页面,例如 403:

python 复制代码
@app.errorhandler(403)
def forbidden(e):
    return "Access forbidden.", 403

第三部分:请求钩子与中间件

3.1 请求前后钩子

请求钩子可以在请求前后执行特定的代码。使用 before_requestafter_request 装饰器:

python 复制代码
@app.before_request
def before_request_func():
    print("Before request")

@app.after_request
def after_request_func(response):
    print("After request")
    return response

before_request: 在请求处理之前执行的代码。

after_request: 在响应返回之前执行的代码。

3.2 创建和使用中间件

中间件是处理请求和响应的函数,可以在它们流动的任意点插入。你可以创建自定义中间件来修饰整个应用的行为:

python 复制代码
@app.middleware
def custom_middleware(environ, start_response):
    print("Before response")
    response = app(environ, start_response)
    print("After response")
    return response

注意:上面是一个示例,Flask 本身没有 @app.middleware 装饰器,但你可以实现类似功能,通常通过 WRAPPER 函数或 Flask 的 WSGI 中间件。

示例小应用

结合以上所有知识,构建一个完整的 Flask 应用的示例:

python 复制代码
from flask import Flask, request, jsonify, render_template

app = Flask(__name__)

@app.route('/user/<string:username>', methods=['GET'])
def get_user(username):
    return jsonify({"username": username})

@app.route('/submit', methods=['POST'])
def submit():
    data = request.json
    return jsonify({"message": "Data received", "data": data}), 201

@app.errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

@app.before_request
def before_request_func():
    print("Before request")

@app.after_request
def after_request_func(response):
    print("After request")
    return response

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

结论

本文详细介绍了 Flask 的路由定义(静态和动态)、错误处理(自定义错误页面)以及请求钩子和中间件的使用。这些功能让你能够更灵活地控制应用程序的行为,并能实现更复杂的逻辑处理。建议在实际项目中实践,把学到的知识应用到独立的功能模块中,增强代码的复用性和可维护性。

相关推荐
也无晴也无风雨25 分钟前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
阿斯卡码1 小时前
jupyter添加、删除、查看内核
ide·python·jupyter
懒惰的bit2 小时前
基础网络安全知识
学习·web安全·1024程序员节
埃菲尔铁塔_CV算法3 小时前
图像算法之 OCR 识别算法:原理与应用场景
图像处理·python·计算机视觉
封步宇AIGC4 小时前
量化交易系统开发-实时行情自动化交易-3.4.2.Okex行情交易数据
人工智能·python·机器学习·数据挖掘
2401_857610034 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端
封步宇AIGC4 小时前
量化交易系统开发-实时行情自动化交易-2.技术栈
人工智能·python·机器学习·数据挖掘
代码小鑫4 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计
Natural_yz4 小时前
大数据学习09之Hive基础
大数据·hive·学习
龙中舞王4 小时前
Unity学习笔记(2):场景绘制
笔记·学习·unity