处理 Flask 路由中的所有异常

我的 Flask 应用程序中有一条简单的路线:


@app.route('/', methods=['GET'])

def homepage():

    return '{}'.format(1 / 0)

当用户访问 site.com/ 时,她应该看到 1/0 的结果。当然这是不可能的,所以 Python 给了我一个错误。


现在,我希望以特殊方式处理所有端点上的所有错误:我希望它们返回 JSON 响应,例如:


{

    'status_code': 500,

    'status': 'Internal Server Error'

}

我写了一个装饰器来做到这一点:


def return_500_if_errors(f):

    def wrapper(*args, **kwargs):

        try:

            return f(*args, **kwargs)

        except:

            response = {

                'status_code': 500,

                'status': 'Internal Server Error'

            }

            return flask.jsonify(response), 500

    return wrapper

然后我将装饰器添加到端点:


@return_500_if_errors

@app.route('/', methods=['GET'])

def homepage():

    return '{}'.format.(1 / 0)

但是,装饰器似乎没有效果。


三国纷争
浏览 206回答 3
3回答

POPMUISE

问题出在装饰器顺序上。这确实有效:def return_500_if_errors(f):    def wrapper(*args, **kwargs):        try:            return f(*args, **kwargs)        except:            response = {                'status_code': 500,                'status': 'Internal Server Error'            }            return flask.jsonify(response), 500    return wrapper@app.route('/', methods=['GET'])@return_500_if_errorsdef homepage():    return '{}'.format.(1 / 0)但有些不同,因为要捕获和返回错误本身 - 而不是标准化的 JSON。

斯蒂芬大帝

这是你需要的:from flask import Flask, jsonifyfrom functools import wrapsapp = Flask(__name__)def catch_custom_exception(func):    @wraps(func)    def decorated_function(*args, **kwargs):        try:            return func(*args, **kwargs)        except Exception as e:            return str(e), 500    return decorated_function@app.route('/', methods=['GET'])@catch_custom_exceptiondef homepage():    return '{}'.format(1 / 0)@app.route('/2', methods=['GET'])def homepage2():    return '{}'.format(1 / 0)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python