Обработчик Django Custom 404

Недавно мы обновились до Django 1.10 и получили эту ошибку на действующем сайте:

встроенные: TypeError custom_404 () получил неожиданный аргумент ключевого слова «исключение»

Код выглядит следующим образом:

urls.py

urlpatterns = [ ... ]
handler404 = global_views.custom_404
handler500 = global_views.custom_500

global_views.py

def custom_404(request, exception, template_name='404.html'):
    return page_not_found(request, exception, template_name=template_name)   

def custom_500(request, template_name='500.html'):
    return server_error(request, template_name=template_name) 

Мы пробовали множество вариантов этого представления, но все они приводят к этой ошибке.

Что происходит не так?


person zubhav    schedule 07.11.2016    source источник
comment
Сервер несколько раз обновлялся и перезагружался. Проблема проявляется в нашем инструменте аналитики программного обеспечения (NewRelic). Я не думаю, что это проблема, с которой сталкиваются клиенты, просто что-то, что происходит на бэкэнде. Просто нужно знать, что вызывает это!   -  person zubhav    schedule 07.11.2016
comment
Я не могу воспроизвести вашу ошибку, пробовали ли вы эти функции, добавляя url(r'^test404/', global_views.custom_404) в url.py, чтобы напрямую протестировать функцию?   -  person Kir Chou    schedule 07.11.2016


Ответы (2)


Ваша функция должна быть определена как:

def custom_404(request, exception=None, template_name='404.html'):

У меня есть несколько часов, чтобы понять это.

person po5i    schedule 10.05.2018

Представление server_error не должно взять exception в качестве аргумента. Его подпись

defaults.server_error(request, template_name='500.html')

Непонятно, почему вы определили представление custom_404, если все, что вы делаете, это вызываете page_not_found. И называть page_not_found в своем custom_500 представлении очень странно.

person Alasdair    schedule 07.11.2016
comment
Я вставил представление custom_404 как представление custom_500 для примера. Мой плохой, я отредактирую это ... Я не хочу использовать собственный шаблон для своего 404 и показывать разные шаблоны ошибок в соответствии с приложением. - person zubhav; 07.11.2016
comment
Чтобы настроить шаблон 404, просто назовите свой шаблон 404.html. Из вашего вопроса не похоже, что вам нужен собственный обработчик 404, и опубликованный вами код не должен вызывать эту ошибку. Возможно, в полной трассировке есть больше полезной информации. - person Alasdair; 07.11.2016
comment
Спасибо за это. Гораздо более простым решением было удалить обработчики и просто позволить Django подобрать файл 404.html. Однако у меня есть три разных приложения, для которых мне нужны разные страницы 404. Вставка 404.html в папку шаблона приложения, похоже, не помогает. Он по-прежнему отображает файл 404.html из корневой папки шаблона. Есть идеи по этому поводу? - person zubhav; 09.11.2016
comment
Если вы хотите динамически изменить шаблон, то установка пользовательского handler404 звучит как хороший подход. - person Alasdair; 09.11.2016