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