开发者

What's the difference between returning a `HttpResponseNotFound` and raising a `Http404` in Django?

开发者 https://www.devze.com 2023-04-12 02:36 出处:网络
There are apparently two different ways to return a 404 error in Django: by returning a HttpResponseNotFound object or by raising an Http404 exception. While I\'m using the former in my proje开发者_开

There are apparently two different ways to return a 404 error in Django: by returning a HttpResponseNotFound object or by raising an Http404 exception. While I'm using the former in my proje开发者_开发百科ct, it seems that Django's internal views are mostly using the latter. Apart from the "Exception is exceptional" mantra, what's the difference between both ways and which should I be using?


An HttpResponseNotFound is just like a normal HttpResponse except it sends error code 404. So it's up to you to render an appropriate 404 page in that view, otherwise the browser will display its own default.

Raising an Http404 exception will trigger Django to call its own 404 error view. Actually, this does little more than render the 404.html template and send it - using HttpResponseNotFound, in fact. But the convenience is that you're then specifying the template (and view, if you like) in one place.


In addition to what Daniel said, raising an Http404 exception can be more flexible in that it allows you to generate a 404 e.g. from a helper function deeper in your call stack (possibly one that usually returns a non-HttpResponse type) and rely on Python's exception propagation instead of having to create a HttpResponseNotFound and manually pass it back up to where you were originally crafting your response.


In addtion to what Daniel and esmail said, for reference, this is literally the definition of HttpResponseNotFound Django (v1.8):

class HttpResponseNotFound(HttpResponse):
    status_code = 404

And for good measure, the definition of Http404:

class Http404(Exception):
    pass
0

精彩评论

暂无评论...
验证码 换一张
取 消