python - 处理Flask路由中的所有异常

标签 python flask python-decorators endpoint

我的 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)

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

最佳答案

我强烈推荐使用Flask的error handler已经存在的装饰器。

基本上,应该类似于:

# flask will check if raised exception is of type 'SomeException' (or lower)
# if so, will just execute this method
@app.errorhandler(SomeException) 
def handle_error(error):
    response = jsonify(error.to_dict())
    response.status_code = error.status_code
    return response

# An exception will be raised, hopefully to be caught by 'handle_error'    
@app.route('/', methods=['GET'])
def homepage():
    return '{}'.format.(1 / 0)

只要确保要捕获的异常具有“status_code”,或者如果没有,则输入“500”...

关于python - 处理Flask路由中的所有异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53702682/

相关文章:

python - 为什么列表和集合之间的元素检查处理方式不同?

python - 在 asyncio 模块中完成一个任务列表后,如何提交另一个任务列表?

python - 如何在 Python 2.7 的观察者模式中使用装饰器

python - 使用 JSON 时出现 Unicode 错误

python - 如何在 Eve 应用程序中使用 add_resource?

javascript - 如何从 Javascript/React 发送 AJAX 请求并在 Python REST API 中接收数据

python - WTForms RadioField 阻止表单验证

python - 出于测试目的访问原始装饰函数

Python 链接装饰器覆盖属性

python - Pandas :如何对子类别中的前 N ​​个观察结果进行子集(和求和)?