Django отображает 404 при отсутствующем шаблоне

#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 /…