Подтвердить что ты не робот

Какая разница между возвратом `HttpResponseNotFound` и поднятием` Http404` в Django?

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

class HttpResponseNotFound(HttpResponse):
    status_code = 404

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

class Http404(Exception):
    pass