处理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)

然而,装饰师似乎没有任何效果。

我强烈建议使用已经存在的Flask错误处理程序decorator。

基本上,应该看起来像:

# 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"。。。

这就是您所需要的:

from flask import Flask, jsonify
from functools import wraps
app = 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_exception
def homepage():
return '{}'.format(1 / 0)
@app.route('/2', methods=['GET'])
def homepage2():
return '{}'.format(1 / 0)

正如@YiFei和@Joost所指出的,问题在于decorators顺序。

这确实有效:

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_errors
def homepage():
return '{}'.format.(1 / 0)

@Joost的答案是相似的,但有点不同,因为它是要捕获和返回的错误本身,而不是标准化的JSON。

最新更新