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