【Flask】abort和errorhandler、app_errorhandler进行请求中断及自定义异常处理

本文介绍在Flask框架中如何使用abort中断请求及自定义错误处理程序,包括404和500错误的定制化处理,以及在蓝图和全局范围内的错误捕捉方法。

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

在Flask view函数中,如果需要中断request,可以使用abort(500)或者直接抛异常raise exception。当然我们还需要返回一个出错信息给前端,所以需要定制一下errorhandler。一般只需要两个handler即可,一个是404错误,一个是500一类的服务器端错误。当然也可以自定义错误。

一、abort中断请求
# 在flask中可以使用abort中断请求,触发请求对应的状态码
from flask import abort
from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    abort(404) # 请求到此即中断,不会打印下面的语句,并返回HTTP状态码401
    print("NOK")

if __name__ == '__main__':
    app.run()
二、errorhandler捕捉当前app或蓝图的状态码,并进行自定制处理

bp是一个蓝图,发生404、500错误时,返回对应的404、500错误页面

from flask import render_template

from mytools.errors import bp


@bp.errorhandler(404)
def not_found_error(error):
    return render_template('errors/404.html')


@bp.errorhandler(500)
def internal_error(error):
    return render_template('errors/500.html')
三、app_errorhandler捕捉全局状态码,并进行自定制异常处理

使用errorhandler修饰器,那么只有本蓝图中的错误才会触发。如果想注册全局的错误处理程序,要用app_errorhandler。

from flask import render_template

from mytools.errors import bp


@bp.app_errorhandler(404)
def not_found_error(error):
    return render_template('errors/404.html')


@bp.app_errorhandler(500)
def internal_error(error):
    return render_template('errors/500.html')
四、补充说明

当我们不是使用的工厂模式创建app时,app.errorhandler(401),即可捕捉全局401状态;若使用了工厂模式create_app方式创建app,则无法进行捕捉,若想捕捉,可以在蓝图中写,如admin.errorhandler(401),即捕捉admin蓝图下所有401状态码,admin.app_errorhandler(401),则是捕捉的全局的401状态码,即其他蓝图中的401状态,也会被捕捉,进行处理。

Flask是一个轻量级的Web框架,它提供了简便的方法来处理异常。Flask中的异常处理可以通过装饰器来实现,主要有以下几种方式: 1. 使用`@app.errorhandler`装饰器: 这个装饰器可以用来捕捉特定的HTTP错误码,并返回自定义的响应。 ```python from flask import Flask, jsonify app = Flask(__name__) @app.errorhandler(404) def not_found(error): return jsonify({'error': 'Not found'}), 404 @app.errorhandler(500) def internal_error(error): return jsonify({'error': 'Internal server error'}), 500 ``` 2. 使用`@app.errorhandler`处理自定义异常: 你可以定义自己的异常类,并使用`@app.errorhandler`来捕捉这些异常。 ```python class MyCustomError(Exception): def __init__(self, message): super().__init__(message) self.message = message @app.errorhandler(MyCustomError) def handle_my_custom_error(error): response = jsonify({'error': error.message}) response.status_code = 400 return response ``` 3. 使用`try-except`块: 在视图函数内部使用`try-except`块来捕捉异常,并使用`flask.abort()`函数来返回特定的HTTP状态码。 ```python from flask import abort @app.route('/data') def get_data(): try: data = some_function_that_may_fail() return jsonify(data) except SomeException as e: abort(400, description=str(e)) ``` 4. 使用`flask.Flask`对象的`teardown_request`方法: 这个方法可以用于在请求结束后执行清理工作,即使发生异常也会执行。 ```python @app.teardown_request def teardown_request(exception): if exception: print(f"An error occurred: {exception}") ``` 通过这些方法,你可以在Flask应用中有效地处理各种异常,确保应用程序的稳定性用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值