Skip to main content
 首页 » 编程设计

python之django之handler404 与 handler500

2025年05月04日34落叶无声

我现在有点困惑。

Django 中有 handler404 和 handler500,我可以覆盖它们。我想,我可以做到这一点:

try: 
   mymodel = MyModel.objects.get(id=someid) 
except MyModel.DoesNotExist: 
   raise Http404 

但我很想知道究竟是什么导致了这个 404 - 服务器错误或只是一个错误的 URL..

这怎么可能?我可以在 handler404 中获得有关 500 错误的信息吗?

在 500 的情况下,handler500 确实有一个 RequestContext 并且 {{STATIC_URL}} 之类的东西将在 500.html 中停止工作。这就是为什么我想,我会提高 404,并通过电子邮件向 404 处理程序内的管理员发送有关错误的电子邮件。这有意义吗?

请您参考如下方法:

底线是这样的:

为了生成/导致/引发 500,您必须请求一个有效的 URL。

这很简单 - 只有在没有 500 错误的情况下才会引发 404,因为 500 错误不会阻止链接有效。

所以如果它是 404,它就没有机会再提高 500;因为如果您不请求有效的 URL,则不会运行服务器端代码;因此,这不能触发 500。

它们是互斥的。

在您的特定情况下,会发生以下情况:

  1. 你请求/foo/bar/1
  2. 此 URL 使用 url 模式映射到 View ,如果它匹配 - 就是这样,您不再有机会引发 404。
  3. 请求已传递给处理程序 - 现在,在此阶段,请求管道无法生成 404。
  4. 您的 View 代码中有一个错误 - 现在可能会发生以下两种情况之一:
    1. 你用 try/except 预料到这个错误,然后你可以提出任何问题 你喜欢的异常(exception)。如果此异常也返回响应,则无论 该响应是 - 这是您在回复客户时发回的错误代码。因此,当您引发 Http404 时,它将返回一个响应,其中包含 404 错误代码。您可以愉快地返回任何其他响应和错误代码组合。
    2. 发生了您的代码未捕获到的错误,或者您的代码未返回正确的响应。在这种情况下,django 的默认异常处理程序将返回响应并引发 500。这是正常/默认情况。

从流程中可以看出,无论如何,要返回 500 响应,URL 必须有效。