【问题标题】:raise a bad request json提出一个错误的请求 json
【发布时间】:2016-04-28 15:20:37
【问题描述】:

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

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

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

【问题讨论】:

标签: python werkzeug


【解决方案1】:

您以令人困惑的方式使用术语“返回”和“提高”。它们具有非常精确的含义。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-07-24
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 1970-01-01
      • 2022-10-17
      • 1970-01-01
      相关资源
      最近更新 更多