自定义错误消息json对象与flask-restful

时间:2014-02-07 22:26:13

标签: flask werkzeug flask-restful

使用abort()方法很容易使用flask-restful传播错误消息,例如

abort(500, message="Fatal error: Pizza the Hutt was found dead earlier today
in the back seat of his stretched limo. Evidently, the notorious gangster
became locked in his car and ate himself to death.")

这将生成以下json输出

{
  "message": "Fatal error: Pizza the Hutt was found dead earlier today
       in the back seat of his stretched limo. Evidently, the notorious gangster
       became locked in his car and ate himself to death.", 
  "status": 500
}

有没有办法用其他成员自定义json输出?例如:

{
  "sub_code": 42,
  "action": "redirect:#/Outer/Space"
  "message": "You idiots! These are not them! You've captured their stunt doubles!", 
  "status": 500
}

7 个答案:

答案 0 :(得分:31)

人们倾向于过度使用abort(),而实际上生成自己的错误非常简单。您可以编写一个可以轻松生成自定义错误的函数,这里的函数与您的JSON匹配:

def make_error(status_code, sub_code, message, action):
    response = jsonify({
        'status': status_code,
        'sub_code': sub_code,
        'message': message,
        'action': action
    })
    response.status_code = status_code
    return response

然后,而不是调用abort()执行此操作:

@route('/')
def my_view_function():
    # ...
    if need_to_return_error:
        return make_error(500, 42, 'You idiots!...', 'redirect...')
    # ...

答案 1 :(得分:23)

我对@dappiu没有50个评论的声誉,所以我只需要写一个新答案,但它确实与" Flask-RESTful有关,设法提供更清洁的方式处理错误" very poorly documented here

这是一个糟糕的文件,花了我一段时间来弄清楚如何使用它。关键是你的自定义异常必须从flask_restful导入HTTPException继承。请注意,您不能使用Python异常。

from flask_restful import HTTPException

class UserAlreadyExistsError(HTTPException):
    pass

custom_errors = {
    'UserAlreadyExistsError': {
        'message': "A user with that username already exists.",
        'status': 409,
    }
}

api = Api(app, errors=custom_errors)

Flask-RESTful团队已经做了很好的工作,使自定义异常处理变得容易,但文档破坏了工作。

答案 2 :(得分:3)

@ Miguel的代码是您应该在大多数时间使用的代码:没有异常,只需在请求处理程序的分支中返回响应。但是,如果您确实需要一个引发异常的中止机制(例如,这在过滤器方法中可能很有用),请注意flask.abort接受Response对象(请检查此gist) :

from flask import abort, make_response, jsonify
abort(make_response(jsonify(message="Message goes here"), 400))

答案 3 :(得分:2)

我必须将属性code定义到我的子类HttpException,以使此自定义错误处理正常工作:

from werkzeug.exceptions import HTTPException
from flask_restful import Api
from flask import Blueprint

api_bp = Blueprint('api',__name__)

class ResourceAlreadyExists(HTTPException):
    code = 400

errors = {
    'ResourceAlreadyExists': {
        'message': "This resource already exists.",
        'status': 409,
    },
}

api = Api(api_bp, errors=errors)

然后再提出异常

raise ResourceAlreadyExists

答案 4 :(得分:1)

显然已经晚了,但同时Flask-RESTful设法提供了一种更清晰的方法来处理错误,正如docs所指出的那样。

此外,issue已打开,表明改进可能有所帮助。

答案 5 :(得分:1)

这是一个非常简单干净的基本功能。它与@Miguel相似,但是专业性较低,并且与Flask的abort()预期用途保持一致。在Python中使用异常控制流并不是反模式,实际上是鼓励使用的。因此,人们可能会争辩说,引发异常而不是返回异常通常是最可行的方法,尤其是因为该框架具有突发事件。

 def json_abort(status_code, data=None):
    if data is None:
        data = {}
    response = jsonify(data)
    response.status_code = status_code
    abort(response)

# then somewhere in your app during a request
json_abort(404, {'error': 'Not Found'}) 

现在,您可以随心所欲地扩展和自定义它。

答案 6 :(得分:0)

使用 Flask-RESTful(0.3.8 或更高版本)

from flask_restful import Api
customErrors = {
    'NotFound': {
        'message': "The resource that you are trying to access does not exist",
        'status': 404,
        'anotherMessage': 'Another message here'
    },
    'BadRequest': {
        'message': "The server was not able to handle this request",
        'status': 400,
        'anotherMessage': 'Another message here'
    }
}
app = Flask(__name__)
api = Api(app, catch_all_404s=True, errors=customErrors)

诀窍是使用 Werkzeug Docs

中的异常

例如,如果您想处理 400 请求,您应该将 BadRequest 添加到 customErrors json 对象中。

或者如果你想处理 404 错误,那么在你的 json 对象中使用 NotFound 等等