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。此外,它确实适用于大多数例外情况,因此它可能不是这里的真正问题。
更新 2。 abort.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.")
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。此外,它确实适用于大多数例外情况,因此它可能不是这里的真正问题。
更新 2。 abort.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.")