django - handler404 与 handler500
我现在有点困惑。
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错误。
它们是互相排斥的。
在你的具体情况下,事情是这样的:
- 你请求了
/foo/bar/1
- 这个网址通过网址模式被映射到一个视图,如果匹配上了——那就没机会再出现404错误了。
- 请求被传递给处理程序——在这个阶段,请求流程无法生成404错误。
- 你的视图代码出现了错误——这时可能会发生两种情况:
- 你用try/except来处理这个错误,这样你可以抛出任何你想要的异常。如果这个异常也返回了一个响应,那么无论这个响应是什么——那就是你返回给客户端的错误代码。所以,当你
raise Http404
时,它会返回一个响应,带有404错误代码。你也可以愉快地返回其他任何响应和错误代码组合。 - 发生了一个没有被你的代码捕获的错误,或者你的代码没有返回一个合适的响应。在这种情况下,django的默认异常处理器会返回一个响应并抛出500错误。这是正常的默认情况。
- 你用try/except来处理这个错误,这样你可以抛出任何你想要的异常。如果这个异常也返回了一个响应,那么无论这个响应是什么——那就是你返回给客户端的错误代码。所以,当你
从这个流程中可以看出,无论如何,要返回500响应,网址必须是有效的。