在Django中返回`HttpResponseNotFound`和提升`Http404`有什么区别?

时间:2011-10-10 08:52:15

标签: django django-views

显然有两种不同的方法可以在Django中返回404错误:返回HttpResponseNotFound个对象或引发Http404异常。虽然我在我的项目中使用前者,但似乎Django的内部视图主要使用后者。除了“异常是特殊的”口头禅之外,两种方式之间有什么区别,我应该使用哪种方式?

3 个答案:

答案 0 :(得分:18)

HttpResponseNotFound就像普通HttpResponse一样,但它会发送错误代码404.因此,您可以在该视图中呈现相应的404页面,否则浏览器将显示其自己的默认值。

引发Http404异常将触发Django调用自己的404错误视图。实际上,这仅仅是渲染404.html模板并使用HttpResponseNotFound发送它。但方便的是,您可以在一个地方指定模板(和视图,如果您愿意)。

答案 1 :(得分:3)

除了丹尼尔所说的,提出Http404例外可以更灵活,因为它允许您生成404例如来自调用堆栈深处的辅助函数(可能是一个通常返回非HttpResponse类型的函数)并依赖于Python的异常传播,而不必创建HttpResponseNotFound并手动将其传递回去你最初是在制作你的回应。

答案 2 :(得分:0)

除了Daniel和esmail所说的,作为参考,这实际上是HttpResponseNotFound Django(v1.8)的定义:

class HttpResponseNotFound(HttpResponse):
    status_code = 404

好的衡量标准是Http404

的定义
class Http404(Exception):
    pass