【flask框架】——异常处理、请求勾子、蓝图和上下文

本文介绍了Flask框架中的异常处理机制,如何捕获和自定义HTTP错误,例如404和500。同时,详细阐述了请求钩子如before_request、after_request等的使用,以及蓝图在项目模块化中的作用。此外,还讲解了Flask的上下文概念,包括请求上下文和应用上下文,以及它们各自的作用和变量,如request、session、current_app和g的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、异常处理

flask对 HTTP错误 进行了封装, 可以捕获http错误, 也可以主动抛出http错误

扩展:

# 权限认证失败
# abort(401)
# 禁止访问
# abort(403)
# 请求方法错误
# abort(405)
# 服务器内部错误
# abort(500)
from flask import Flask, redirect, abort

# 需求:捕获项目中的所有404异常信息,引导到一个统一的页面
# 需求:主动产生异常
app = Flask(__name__)


@app.route('/')
def hello_world():
    # a = 1/0
    # 主动抛出异常
    # 参数:必须是http标准的错误状态码
    abort(404)

    return 'Hello World!'


# code_or_exception参数:捕获错误状态码,异常类
@app.errorhandler(404)
def error_404_handler(e):
    print(e)
    # 统一引导到指定页面,提高用户体验
    return redirect("http://err.www.mi.com/04.html")


@app.errorhandler(ZeroDivisionError)
def error_handler(e):
    return "不能除0"


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

2、请求勾子

在这里插入图片描述

before_request
每次执行视图函数之前调用
对请求进行一些准备处理
如果在该函数中返回了一个响应,视图函数将不再被调用
after_request
如果没有抛出错误,每次执行视图函数之后(已经包装为响应对象)调用
在此函数中可以对响应值在返回之前做最后一步修改处理
接受一个参数:包装好的响应对象
需要将修改后的响应对象返回
before_first_request
web应用被第一次请求前调用
可以进行web应用初始化处理
teardown_request
每次执行视图函数之后调用
无论是否出现异常都会执行, 一般用于请求收尾
接受一个参数:错误信息,如果有相关错误抛出

示例:

@app.before_first_request
def inital():
    """
    第一次请求之前调用[仅会调用一次]
    作用:项目初始化操作
    :return: 不需要返回
    """
    print("before_first_request 调用了")

2、蓝图(相当于Django的中间件)

1、蓝图的作用: 实现Flask项目 模块化,作用和app对象类似,只不过app对象管理的是整个工程,蓝图管理的是单个模块。
2、项目模块化主要是 将业务以功能模块进行划分, 每个功能模块对应一个包, 用于存放和其有关的视图/工具/模型文件等, 如home, user
3、对于大型项目, 一般 每个功能模块对应创建一个蓝图, 由多个蓝图代替应用来分别管理各模块的视图
在这里插入图片描述

3、上下文(context)

上下文:是一个 数据容器,保存了 Flask 程序运行过程中的一些信息。
Flask中有两种上下文,请求上下文应用上下文
两种上下文的使用范围相同, 从请求开始到请求结束, 在范围外使用会报错

  1. 请求上下文

记录一些和请求有关的数据, 包括request和session两个变量
request
封装了HTTP请求的内容,针对的是http请求。
session
用来记录请求会话中的信息,针对的是用户信息。

  1. 应用上下文
    记录一些和应用有关的数据, 包括current_appg两个变量

current_app
会自动引用创建的Flask对象, 需要在项目的其他文件中使用app时, 应该通过current_app来获取, 可以减少循环导入问题
g
flask给开发者预留的一个容器, 用于记录自定义数据
生命周期:[请求开始 返回响应]
作用范围:默认情况在视图函数内部才能使用
特点:每一次请求结束之后会清空

# 导包
from flask import Flask, request, session, current_app, g
# 在视图函数外面,获取当前工程的app对象
with app.app_context():
     print(current_app)

g变量的使用,一般在钩子函数视图函数之间进行参数传递

g.username = "Tom"  # 赋予g变量值
print(g.username)   # 获取g变量值
### Flask框架使用指南 Flask 是一种轻量级的 Web 应用开发框架,适合快速构建小型至中型的应用程序。以下是关于如何安装、配置使用 Flask 的详细说明。 #### 安装 Flask 可以通过 `pip` 工具来安装 Flask 框架。执行以下命令即可完成安装: ```bash pip install Flask ``` 如果需要升级到最新版本,则可以运行以下命令[^1]: ```bash pip install --upgrade Flask ``` --- #### 创建最简单的 Flask 程序 下面是一个最基本的 Flask 应用示例: ```python from flask import Flask app = Flask(__name__) @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run() ``` 此代码创建了一个名为 `hello_world` 的函数,并将其绑定到了根路径 `/` 上。当访问服务器地址时,会返回字符串 `'Hello World!'`。 --- #### 配置调试模式 为了方便开发过程中的错误排查,可以在启动应用时启用调试模式。通过设置参数 `debug=True` 来开启调试功能: ```python if __name__ == '__main__': app.run(debug=True) ``` 这会使每次修改代码后自动重新加载服务并显示详细的错误信息[^5]。 --- #### 路由与视图函数 路由用于指定 URL 处理该请求的 Python 函数之间的映射关系。例如,定义两个不同的路由分别展示用户资料文章详情页: ```python @app.route('/user/<username>') def show_user_profile(username): return f'用户名是: {username}' @app.route('/post/<int:post_id>') def show_post(post_id): return f'ID是: {post_id}' ``` 这里 `<username>` 表示动态部分,而 `<int:post_id>` 则限定传入值必须为整数类型[^5]。 --- #### 请求重定向与外部链接生成 利用 `url_for()` 方法能够安全地生成内部或外部URL;配合 `redirect()` 可实现页面跳转效果。比如模拟登录成功后的转向操作: ```python @app.route('/login') def login(): flag = 'success' if flag: return redirect(url_for('index')) return "登录页面" ``` 其中 `url_for('index')` 自动生成对应于 `@app.route('/')` 所注册名称(默认为首字母小写的函数名)的实际网址。 --- #### 使用上下文管理机制 Flask 提供了两种主要的上下文——**请求上下文** **应用上下文** ,它们帮助开发者更好地管理共享数据资源。具体来说,这些上下文对象充当临时存储空间,在特定生命周期范围内有效存在[^2]。 - **全局代理变量** 常见的例子包括 `request`, `session`, `g` 等预设好的实例化对象,允许我们在不同位置轻松获取当前 HTTP 请求相关信息或其他自定义状态值。 - **手动控制上下文切换** 当某些场景下需脱离常规流程单独触发任务时,可借助辅助工具类如 `with app.app_context:` 构建人工环境支持跨线程调用数据库查询等功能模块。 --- #### 导入第三方扩展库 许多常用的功能都可以通过官方推荐或者社区贡献的形式作为插件形式加入项目之中。按照惯例命名规则查找目标组件之后按需引入相应接口成员即可开始工作[^3]: ```python from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy(app) # 或者其他样式的声明方式... ``` --- #### 将应用程序转换成包结构 随着业务复杂度增加单文件难以维护时考虑重构拆分多个子单元协同作业。此时就需要建立标准 python package 并初始化必要的入口脚本文件 `__init__.py` 。同时还可以进一步划分蓝图(blueprint)概念简化大型系统的组织架构设计思路[^4]. ```python # project/__init__.py 中的内容片段示意 from flask import Blueprint bp_example = Blueprint('example', __name__) import .routes ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值