提出一个错误的请求 json

raise a bad request json

我正在努力在 api 中提出一个错误的请求,但得到了 json 的回复。思路是:

if True:
    raise BadRequest({'error_message' : 'stuff',
                      'suggestions'   : 'other stuff'})

显然这行不通,但我不确定这是否违反 return 一个 json 错误请求的逻辑。

您在使用术语 "return" 和 "raise" 时造成混淆。它们的含义非常准确。

您只能"raise" Exception 的子类。 "raise"语句之后的程序执行路径遵循Python异常处理的规则。引发异常的函数不会 return。您可以创建 Exception 的子类,其中参数是字典,如您的示例所示。这类似于 JSON 对象,但如果您想将它用作 raise 语句,它仍然必须是 Exception 的子类。

您可以 "return" 函数中的任何类型的对象。程序的执行路径遵循Python个函数调用和return个规则。 returned 对象可能是 JSON 对象,对象的内容可能是一条错误消息。但是,如果您的函数 return 是此类对象,则您的客户端代码必须检查此对象以确定是否发生了错误。

我想您正在使用 Flask。答案是肯定的,您可以指示 Flask 在出现错误时正确格式化 HTTP 响应。您必须注册一个特定的处理程序,然后您可以在那里管理您想要的格式。

这里是一个例子,灵感来自 Coderwall post

from flask import jsonify
from werkzeug.exceptions import default_exceptions
from werkzeug.exceptions import HTTPException

class JSONExceptionHandler(object):
    def __init__(self, app=None):
        if app:
            self.init_app(app)

    def std_handler(self, error):
        response = jsonify(message=str(error))
        response.status_code = error.code if isinstance(error, HTTPException) else 500
        return response

    def init_app(self, app):
        self.app = app
        self.register(HTTPException)
        for code, v in default_exceptions.iteritems():
            self.register(code)

    def register(self, exception_or_code, handler=None):
        self.app.errorhandler(exception_or_code)(handler or self.std_handler)

然后,当您创建 Flask 应用程序时:

app = Flask('your_app')
JSONExceptionHandler(app)