Джанго дисплей 404 на отсутствующий шаблон - PullRequest
9 голосов
/ 08 мая 2011

У меня есть сайт, где некоторые страницы редактируются вручную.Когда один из этих шаблонов отсутствует, это просто означает, что страница отсутствует, поэтому я хотел бы отобразить ошибку 404.

Вместо этого я получаю исключение TemplateDoesNotExist.

Есть ли способ заставить Django отображать ошибку 404, когда он не находит шаблон?

Ответы [ 3 ]

12 голосов
/ 08 мая 2011

Если вам нужно такое поведение для всех просмотров на вашем сайте, вы можете написать свое собственное промежуточное ПО с помощью метода 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 в settings.py. Будьте осторожны с положением, где вы добавляете это. Действует стандартное предупреждение промежуточного программного обеспечения Django:

Опять же, промежуточное ПО запускается в обратном порядке на этапе ответа, который включает в себя process_exception. Если промежуточное программное обеспечение исключения возвращает ответ, классы промежуточного программного обеспечения выше этого промежуточного программного обеспечения вообще не будут вызываться.

9 голосов
/ 08 мая 2011

помещает возврат ответа в представление (или там, где отображается шаблон) в блок try-кроме:

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
0 голосов
/ 08 мая 2011

С моей головы, но если в настройках вы установите DEBUG = False, не получите ли вы 404 при каждой ошибке (включая TemplateNotFound)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...