django - handler404 vs handler500

时间:2014-08-21 14:39:26

标签: python django

我现在有点困惑。

我可以覆盖Django中的handler404和handler500。我想,我可以这样做:

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

但我很想知道究竟是什么造成了这个404 - 服务器错误或只是错误的网址..

这怎么可能?我可以在handler404内有大约500个错误信息吗?

如果是500,则handler500确实有RequestContext{{STATIC_URL}}之类的内容将停止在500.html中运行。这就是为什么我想,我会提出404而不是发送电子邮件404管理员内部的管理员有关错误。这有意义吗?

1 个答案:

答案 0 :(得分:1)

底线是:

为了生成/导致/提高500,您必须请求有效的URL。

非常简单 - 只有在没有500错误时才会引发404,因为500错误不会阻止链接生效。

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

它们是相互排斥的。

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

  1. 您请求/foo/bar/1
  2. 此网址使用网址模式映射到视图,如果匹配 - 那就是它,您再也没有机会筹集404了。
  3. 请求被传递给处理程序 - 现在,在此阶段,请求管道无法生成404。
  4. 您的视图代码出错 - 现在可能发生以下两种情况之一:
    1. 您可以尝试使用try / except来预测此错误,然后您可以提出任何问题 你喜欢的例外。如果此异常也返回响应,那么无论如何 响应是 - 这是您在回复客户端时发回的错误代码。因此,当您raise Http404时,它将返回一个响应,其中包含404错误代码。您可以愉快地返回任何其他响应和错误代码组合。
    2. 发生的错误未被您的代码捕获,或者您的代码未返回正确的响应。在这种情况下,django的默认异常处理程序将返回响应并引发500.这是正常/默认情况。
  5. 从流程中可以看出,无论如何,要返回500响应,URL必须有效。