За формирование страницы ошибки отвечает функция technical_500_response
из django.views.debug
,
программисты джанги пошли странным путем, жестко задав (без возможности настройки): если запрос AJAX — ответ будет текстом, в остальных случаях HTML.
Все бы ничего, но raise Http404()
, например, плевать на этот механизм хотела, и все равно выбрасывает HTML, если выводить ошибку в консоль — сущий ад.
Изменить поведение можно например так:
Добавить Middleware которая, в случае ошибки уберет из request соответствующий заголовок,
дальше джанга отработает по своему алгоритму и вернет красивый HTML.
Криво конечно, т.к. пропадает возможность узнать был Ajax или не было, но не нужно патчить Django
1 2 3 4 | class DisableAjaxException(object): @staticmethod def process_exception(req, exception): req.META['HTTP_X_REQUESTED_WITH'] = None |
Ну и остается напомнить, порядок Middleware в settings.py
важен