提出一个不好的请求json

时间:2016-01-22 05:35:23

标签: python werkzeug

我正在努力在api中提出一个错误的请求,让json回来。这个想法是:

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

显然这不起作用,但我不确定是否违反逻辑以返回带有错误请求的json。

2 个答案:

答案 0 :(得分:1)

您正在以令人困惑的方式使用“return”和“raise”这两个词。它们具有非常精确的含义。

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

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

答案 1 :(得分:1)

我想您正在使用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)