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

相关推荐
lizi8888840 分钟前
打包Python代码的常用方法实现程序exe应用
开发语言·python
yava_free42 分钟前
机器学习TFIDF的情感分类文章
python·机器学习·分类·tf-idf
api茶飘香2 小时前
守护应用边界:通过反射API实现安全的输入输出过滤
java·开发语言·python·安全·django·virtualenv·pygame
七十二五2 小时前
matlab数据批量保存为excel,文件名,行和列的名称设置
经验分享·算法·matlab·青少年编程·矩阵·excel
sco52822 小时前
【Shiro】Shiro 的学习教程(三)之 SpringBoot 集成 Shiro
spring boot·后端·学习
安全在心中3 小时前
python-网页自动化(三)
运维·python·自动化
Slow3 小时前
自动化焊缝定义程序fe-safe
运维·python·自动化
小小小小关同学5 小时前
Spring Cloud LoadBalancer
后端·spring·spring cloud
学地理的小胖砸5 小时前
【GEE的Python API】
大数据·开发语言·前端·python·遥感·地图学·地理信息科学
丢爸5 小时前
网络学习-eNSP配置NAT
linux·网络·学习