Может ли у вас более одного приложения обрабатывать 404 в Django?

По-видимому, Django flatpages обрабатывает 404-е сообщение, отправленное другими приложениями. Мне было интересно, могу ли я сделать другое приложение типа плоских страниц, которое получит трещину на уровне 404 раньше, чем плоские страницы. Я пробовал это пока безуспешно. Шаблон отображается, но данные не поступают.

Это вообще возможно?


person rick    schedule 28.04.2009    source источник


Ответы (2)


Согласно документации Django, вы можете указать собственное представление как обработчик 404 или 500:

handler404 = 'mysite.views.my_custom_404_view'

Итак, ваше приложение может определить пользовательское представление обработки ошибок в views.py, которое вы можете настроить в качестве обработчика для представления 404 или 500 в вашем urls.py

См. «Настройка представлений об ошибках "для получения дополнительной информации.

person vezult    schedule 28.04.2009
comment
это работает, только если я помещаю handler404 в свой основной urls.py. что, если бы у меня было несколько приложений, и каждое приложение должно иметь свой собственный обработчик 404. например. приложение web-gui - хорошая html-страница, а остальное api - ответ json? - person Florian; 14.03.2013

Встроенное приложение с плоскими страницами работает с некоторыми промежуточное ПО: промежуточное ПО имеет функцию под названием process_response, которая проверяет исходящие ответы на наличие кода состояния 404. Если ответом является 404, а URL-адрес соответствует плоской странице, промежуточное программное обеспечение подавляет 404 и возвращает визуализированную плоскую страницу.

Вы можете сделать то же самое с вашим собственным промежуточным программным обеспечением. Чтобы гарантировать, что ваш код вызывается до кода плоских страниц, ваше промежуточное ПО должно располагаться после плоских страниц в вашей MIDDLEWARE_CLASSES настройке:

# in settings.py
MIDDLEWARE_CLASSES = (
    # ...
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
    'myapp.middleware.MyMiddlewareClass',
)

Причина, по которой это происходит после, а не до, заключается в том, что на этапе ответа Django применяет промежуточное ПО в обратном порядке.

person Justin Voss    schedule 28.04.2009
comment
Спасибо за предложение. Это интересно о порядке промежуточного программного обеспечения. Я попытался изменить порядок, но в моем случае это не имело значения. - person rick; 29.04.2009