#django #http-status-code-404
#django #http-status-code-404
Вопрос:
У меня есть веб-сайт, где некоторые страницы редактируются вручную. Когда один из этих шаблонов отсутствует, это просто означает, что страница отсутствует, поэтому я хотел бы отобразить ошибку 404.
Вместо этого я получаю исключение TemplateDoesNotExist.
Есть ли способ сообщить Django отображать ошибку 404 всякий раз, когда он не находит шаблон?
Ответ №1:
Если вы хотите, чтобы такое поведение применялось ко всем представлениям на вашем сайте, возможно, вам захочется написать собственное промежуточное программное обеспечение с process_exception
методом.
from django.template import TemplateDoesNotExist
from django.views.defaults import page_not_found
class TemplateDoesNotExistMiddleware(object):
"""
If this is enabled, the middleware will catch
TemplateDoesNotExist exceptions, and return a 404
response.
"""
def process_exception(self, request, exception):
if isinstance(exception, TemplateDoesNotExist):
return page_not_found(request)
Если вы определили свой собственный, handler404
вам нужно было бы заменить page_not_found
приведенный выше. Я не совсем уверен, как вы могли бы преобразовать строку handler404
в вызываемую, требуемую в промежуточном программном обеспечении..
Чтобы включить промежуточное программное обеспечение, добавьте его в MIDDLEWARE_CLASSES
in settings.py
. Будьте осторожны с позицией, в которой вы его добавляете. Применяется стандартное предупреждение промежуточного программного обеспечения Django:
Опять же, промежуточное программное обеспечение запускается в обратном порядке на этапе ответа, который включает process_exception . Если промежуточное программное обеспечение с исключениями возвращает ответ, классы промежуточного программного обеспечения выше этого промежуточного программного обеспечения вообще вызываться не будут.
Ответ №2:
поместите возврат ответа в представление (или где бы ни отображался шаблон) в блок исключения попытки:
from django.http import Http404
from django.shortcuts import render_to_response
from django.template import TemplateDoesNotExist
def the_view(request):
...
try:
return render_to_response(...)
except TemplateDoesNotExist:
raise Http404
Комментарии:
1. Необходимо импортировать исключение:
from django.template import TemplateDoesNotExist
.2. Спасибо за дополнение. Я забыл, откуда импортировать исключение, поскольку не смог проверить. Отредактировал ответ.
3. Да, я знаю, что могу это сделать, но во всех представлениях это становится шаблонным. Я надеялся, что есть глобальный способ сделать это.
4. Если вы хотите избежать шаблонности, определите функцию,
my_render_to_response
которая инкапсулируетtry..except
блок. Затем используйтеmy_render_to_response
в своих представлениях вместо render_to_response.
Ответ №3:
У меня в голове не укладывается, но если вы установите DEBUG = False в своих настройках, не будете ли вы получать 404 при каждой ошибке (включая TemplateNotFound)?
Комментарии:
1. Я так думаю, но мне это нужно для тестирования.
2. Этот ответ неверен. В случае ошибок поведение Django по умолчанию заключается в запуске
server_error
представления, рендеринге500.html
шаблона и возврате страницы с кодом ошибки 500. Смотрите docs.djangoproject.com/en/dev/topics/http/views /…