django - handler404 与 handler500

2 投票
1 回答
1519 浏览
提问于 2025-04-18 18:04

我现在有点困惑。

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 个回答

1

简单来说就是:

要想产生一个500错误,你必须请求一个有效的网址。

这很简单——404错误只会在没有500错误的情况下出现,因为500错误不会影响链接的有效性。

所以如果出现404错误,就不可能同时出现500错误;因为如果你没有请求一个有效的网址,服务器端的代码就不会运行,这样就无法触发500错误。

它们是互相排斥的。

在你的具体情况下,事情是这样的:

  1. 你请求了 /foo/bar/1
  2. 这个网址通过网址模式被映射到一个视图,如果匹配上了——那就没机会再出现404错误了。
  3. 请求被传递给处理程序——在这个阶段,请求流程无法生成404错误。
  4. 你的视图代码出现了错误——这时可能会发生两种情况:
    1. 你用try/except来处理这个错误,这样你可以抛出任何你想要的异常。如果这个异常也返回了一个响应,那么无论这个响应是什么——那就是你返回给客户端的错误代码。所以,当你 raise Http404 时,它会返回一个响应,带有404错误代码。你也可以愉快地返回其他任何响应和错误代码组合。
    2. 发生了一个没有被你的代码捕获的错误,或者你的代码没有返回一个合适的响应。在这种情况下,django的默认异常处理器会返回一个响应并抛出500错误。这是正常的默认情况。

从这个流程中可以看出,无论如何,要返回500响应,网址必须是有效的。

撰写回答