【问题标题】:Custom abort mapping/exceptions in FlaskFlask 中的自定义中止映射/异常
【发布时间】: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 对象。此外,它确实适用于大多数例外情况,所以这可能不是真正的问题。

更新 2abort.mapping 执行起来似乎非常好。有问题的例外被覆盖,包括404

更新 3:我整理了一个小沙箱,用于调试。(删除了 repo,因为谜团早已解开)。

【问题讨论】:

  • Flask/Werkzeug 的维护者,请不要推荐使用abort.mapping,因为该属性不是公共 API。 abort 被记录为一个函数,而在 Werkzeug 0.12 中,此代码实际上不再起作用。我们刚刚收到一个错误报告,暗示我们在这里破坏了我们的公共 API。
  • @MarkusUnterwaditzer 但是在一个地方覆盖所有原始错误和消息的首选方法是什么?
  • 目前没有我承认的。

标签: python exception flask werkzeug httpexception


【解决方案1】:

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

from flask import abort

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

【讨论】:

  • 我知道这个选项。让这些信息提供太多信息通常不是一个好主意,尤其是在封闭的商业项目的情况下。在每种情况下都覆盖它也很烦人。
【解决方案2】:

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

为什么一开始还有这段代码?好吧,也许,我可以忍受,但它应该是整个文档。即使我在谷歌上搜索了常量的名称,我也只发现了几个 GitHub 问题(12)。

总之,谜团正式解开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2011-07-18
    相关资源
    最近更新 更多