Flask 中的自定义中止 mapping/exceptions

Custom abort mapping/exceptions in Flask

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 中收到这些消息的回复时,我无法理解这些消息(尤其是第一个,我认为加密或 headers 有问题)我认为是尝试为每个 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 而不是 flask_restful 导入的 abort,因为后者没有映射,而且它是一个函数,而不是 Aborter object。此外,它确实适用于大多数例外情况,因此它可能不是这里的真正问题。

更新 2abort.mapping 似乎在执行时完全没问题。有问题的例外被覆盖,包括 404

更新 3:我整理了一个小沙箱,用于调试。(删除了 repo,因为神秘早就解决了)。

我花了一些时间,但现在我真的找到了地方,在那里它因 404 错误而出轨。它实际上是 flask-restful 中一个未记录的功能。看这里 the code。您选择的任何消息都会一直保留到那个地方,然后它成为默认消息。我们现在需要的只是将 ERROR_404_HELP = False 放入我们的配置中,一切都会按预期进行。

为什么这个代码一开始就在那里?好吧,也许,我可以接受,但它应该遍布整个文档。即使当我用谷歌搜索常量的名称时,我也只得到了几个 GitHub 个问题 (1, 2)。

总之,谜团正式解开

顺便说一下...我无法指出我是如何发现这个的文档,我只是尝试了一下(这就是我学习大部分开发的方式!)但是,您可以简单地中止所需的响应代码,而是return 自定义字符串。我认为这是有道理的,因为您正在按照预期的方式使用框架,您没有编写大量代码,您正在 return 以框架期望的方式输入正确的响应代码,并且您'重新通知任何阅读它的人有关错误的应用程序上下文。

from flask import abort

abort(404, "And here's why.")