6

Flask400异常 ( 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). 调试没有太大帮助。这里的罪魁祸首可能是什么?

更新。是的,我使用的abort是从flasknot导入的,flask_restful因为后者没有映射,它是一个函数而不是一个Aborter对象。此外,它确实适用于大多数例外情况,所以这可能不是真正的问题。

更新 2。执行abort.mapping起来似乎完全没问题。有问题的例外被覆盖,包括404. 证明图片

更新 3:我整理了一个小沙箱,用于调试。(由于谜团早已解决,因此删除了回购协议)。

4

2 回答 2

5

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

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

无论如何,谜团已经正式解开。

于 2015-12-04T13:31:19.027 回答
2

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

from flask import abort

abort(404, "And here's why.")
于 2016-02-23T14:56:05.787 回答