【发布时间】:2016-03-08 02:01:27
【问题描述】:
Flask 400 异常 (abort()) 的默认消息是:
{
"message": "The browser (or proxy) sent a request that this server could not understand."
}
对于404:
{
"message": "The requested URL was not found on the server. If you entered the URL manually please check your spelling and try again. You have requested this URI [/obj/] but did you mean /obj/ or /obj/<int:id>/ or /obj/<int:id>/kill/ ?"
}
当我在我的 API 中将这些消息作为回复获取时,我无法理解它们(尤其是第一个,我认为加密或标头有问题),而且我觉得尝试手动覆盖每个文本有点烦人abort() 异常。所以我改变了映射:
from flask import abort
from werkzeug.exceptions import HTTPException
class BadRequest(HTTPException):
code = 400
description = 'Bad request.'
class NotFound(HTTPException):
code = 404
description = 'Resource not found.'
abort.mapping.update({
400: BadRequest,
404: NotFound
})
对于400,它运行良好。但是当涉及到404 时,它仍然是同样的信息。我在我的代码中的相同位置对其进行了测试——它适用于abort(400)、abort(403) 和其他一些,但它被abort(404) 上的默认消息神秘地覆盖。调试没有太大帮助。这里的罪魁祸首可能是什么?
更新。是的,我使用的是从flask 导入的abort 而不是flask_restful,因为后者没有映射,它是一个函数而不是Aborter 对象。此外,它确实适用于大多数例外情况,所以这可能不是真正的问题。
更新 2。 abort.mapping 执行起来似乎非常好。有问题的例外被覆盖,包括404。
更新 3:我整理了一个小沙箱,用于调试。(删除了 repo,因为谜团早已解开)。
【问题讨论】:
-
Flask/Werkzeug 的维护者,请不要推荐使用
abort.mapping,因为该属性不是公共 API。abort被记录为一个函数,而在 Werkzeug 0.12 中,此代码实际上不再起作用。我们刚刚收到一个错误报告,暗示我们在这里破坏了我们的公共 API。 -
@MarkusUnterwaditzer 但是在一个地方覆盖所有原始错误和消息的首选方法是什么?
-
目前没有我承认的。
标签: python exception flask werkzeug httpexception