【发布时间】:2016-04-28 15:20:37
【问题描述】:
我正在努力在返回 json 的 api 中提出错误请求。这个想法是:
if True:
raise BadRequest({'error_message' : 'stuff',
'suggestions' : 'other stuff'})
显然这行不通,但我不确定返回带有错误请求的 json 是否违反逻辑。
【问题讨论】:
我正在努力在返回 json 的 api 中提出错误请求。这个想法是:
if True:
raise BadRequest({'error_message' : 'stuff',
'suggestions' : 'other stuff'})
显然这行不通,但我不确定返回带有错误请求的 json 是否违反逻辑。
【问题讨论】:
您以令人困惑的方式使用术语“返回”和“提高”。它们具有非常精确的含义。
您只能“引发”异常的子类。 “raise”语句之后的程序执行路径遵循Python异常处理的规则。引发异常的函数不会返回。您可以创建 Exception 的子类,其中参数是字典,如您的示例中所示。这类似于 JSON 对象,但如果您想使用 raise 语句,它仍然必须是 Exception 的子类。
您可以从函数中“返回”任何类型的对象。程序的执行路径遵循 Python 函数调用和返回的规则。返回的对象可能是 JSON 对象,对象的内容可能是错误消息。但如果您的函数返回这种类型的对象,您的客户端代码必须检查此对象以确定发生了错误。
【讨论】:
我想你正在使用 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)
【讨论】: