【问题标题】:Django REST Framework does not intercept 404 exceptions and outputs HTML instead of JSONDjango REST Framework 不拦截 404 异常,输出 HTML 而不是 JSON
【发布时间】:2018-11-20 08:42:12
【问题描述】:

在使用 Django REST Framework 时,documentation 提到 Http404 异常被 DRF 拦截和处理。然而,当我在实践中尝试这个时,我仍然从 Django 中得到一个 HTML 响应:

$ curl http://127.0.0.1:8000/foo
<h1>Not Found</h1><p>The requested URL /foo was not found on this server.</p>

奇怪的是,方法不允许的异常被捕获并正确转换为 JSON。为什么它不适用于 404?

编辑:附加-H 'Accept: application/json'也没有效果;仍然提供相同的 HTML。

【问题讨论】:

  • 你能显示各自的view 吗?
  • @JerinPeterGeorge 没有相应的视图,因此是 404。
  • 是的,您不会获得 JSON 或 XML 文件作为 HTTP 404 的响应。您也不需要它。实际上,您甚至不需要 HTML 文件。您唯一真正需要的是 HTTP 标头。在您的客户端中,您只需检查 HTTP 状态代码。如果是200就可以继续,否则就得处理异常了。
  • @cezar 很好,但我仍然很好奇为什么文档说 DRF 拦截了 Http404 异常。按照这个逻辑,404s 也应该变成 JSON 格式的错误,不是吗?

标签: django django-rest-framework


【解决方案1】:

我认为这是一个简单的逻辑,Method Not Allowed 异常与使用DRF 定义的view 有关。这意味着当在某个视图(DRF-View)达到请求时会引发异常。

如果输入 URL 与定义的 URL 不匹配,则在 URL Dispatcher 引发 Page Not Found 异常,因此它会调用 404(找不到页面)视图。而且,当我们尝试获取实例的详细信息 (api/some_endpoint/instance_id/) 并且在 DB 中找不到它时,DRF 会处理 HTTP 404 Not Found

参考: The 404 (page not found) view

【讨论】:

  • 哈哈,这就解释了。谢谢!
猜你喜欢
  • 2018-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
  • 2011-05-13
相关资源
最近更新 更多