В чем разница между возвратом `HttpResponseNotFound` и вызовом `Http404` в Django?

#django #django-views

#django #django-просмотры

Вопрос:

По-видимому, есть два разных способа вернуть ошибку 404 в Django: путем возврата HttpResponseNotFound объекта или путем создания Http404 исключения. Хотя я использую первое в своем проекте, кажется, что внутренние представления Django в основном используют последнее. Помимо мантры «Исключение является исключительным», в чем разница между обоими способами и которые я должен использовать?

Ответ №1:

An HttpResponseNotFound похож на обычный HttpResponse , за исключением того, что он отправляет код ошибки 404. Итак, вам нужно отобразить соответствующую страницу 404 в этом представлении, в противном случае браузер отобразит свое собственное значение по умолчанию.

Создание Http404 исключения приведет к тому, что Django вызовет собственное представление ошибки 404. На самом деле, это делает немного больше, чем просто отображает 404.html шаблон и отправить его — используя HttpResponseNotFound , по сути. Но удобство заключается в том, что затем вы указываете шаблон (и представление, если хотите) в одном месте.

Комментарии:

1. Ссылка на документ: docs.djangoproject.com/en/dev/topics/http/views /…

Ответ №2:

В дополнение к тому, что сказал Дэниел, создание Http404 исключения может быть более гибким, поскольку оно позволяет вам генерировать 404, например, из вспомогательной функции, расположенной глубже в вашем стеке вызовов (возможно, той, которая обычно возвращает не HttpResponse тип) и полагаться на распространение исключений Python вместо того, чтобы создавать HttpResponseNotFound и передавать вручнуюон возвращается к тому месту, где вы изначально создавали свой ответ.

Ответ №3:

В дополнение к тому, что сказали Дэниел и Эсмаил, для справки, это буквально определение HttpResponseNotFound Django (v1.8):

 class HttpResponseNotFound(HttpResponse):
    status_code = 404
  

И для хорошей оценки определение Http404 :

 class Http404(Exception):
    pass