Неправильно настроенные пользовательские шаблоны ошибок HTTP в проекте Django (404 500) - PullRequest
0 голосов
/ 22 октября 2018

Я нахожусь в ад Django коды ошибок HTTP.Было бы здорово, если бы эксперт мог помочь мне из-за моей неправильной конфигурации.

Мой проект Django работает с nginx в качестве обратного прокси-сервера, связанного с сервером приложений gunicorn.

Требование:

Я хочу, чтобы пользовательский шаблон Page not found отображался (т.е. 404) при вводе шаблона URL, которого нет в моем urls.py.Звучит достаточно просто, и хорошо документировано .

Я уже реализовал это.

Проблема:

Предположим, example.com - мой живой проект.

1) Если я пытаюсь получить доступ к https://example.com/asdfasdf (т. Е. Несоответствие, случайный бред) на моем производственном сервере, вместо 404.

отображается шаблон 500.

2) Далее, если я попытаюсь curl указанный шаблон URL через curl -I https://example.com/asdfasdf/, я вижу 200 OK вместо 404 или 500.Wth?

3) Более того, если я попробую то же самое поведение с Debug = True на локальном хосте, 404 будет возвращено правильно (и шаблон, и код ошибки HTTP согласуются).

Эти 3 поведения довольно озадачивают.

Моя конфигурация:

Я создал error_views.py и вставил его в папку, где храню свой обычный views.py.Этот файл ошибок содержит:

from django.shortcuts import render

def server_error(request):
    return render(request, '500.html')

def not_found(request):
    return render(request, '404.html')

def permission_denied(request):
    return render(request, '404.html')

def bad_request(request):
    return render(request, '404.html')

В моем urls.py (хранящемся в той же папке, что и settings.py) я добавил следующее после всех шаблонов URL:

handler404 = 'my_app.error_views.not_found'
handler500 = 'my_app.error_views.server_error'
handler403 = 'my_app.error_views.permission_denied'
handler400 = 'my_app.error_views.bad_request'

Iсоздал 404.html и 500.html и вставил их в каталог /templates/ по умолчанию.

В settings.py у меня есть ALLOWED_HOSTS = ['*']

Наконец, моя команда nginx имеет дело с этим следующим образом (помещается в блок server в файле виртуального хоста):

# Error pages
error_page 500 502 503 504 /500.html;
location = /500.html {
    root /home/ubuntu/this_proj/project_dir/templates/;
}

location = /too_bad.svg {
    root /home/ubuntu/this_proj/project_dir/static/img/;
}

Все это довольно обычные вещи, и мне не хватает того, что я здесь неправильно настроил.Может ли эксперт вывести меня из этого беспорядка?

Заранее спасибо, и, пожалуйста, запросите дополнительную информацию в случае необходимости.

Примечание. Я пробовал решения, приведенные в аналогичных вопросах, по SO здесь и здесь .Само собой разумеется, что эти неправильные конфигурации были очень разными, не показывая ни одного из симптомов, которые я вижу.

1 Ответ

0 голосов
/ 22 октября 2018

Если вы используете пользовательский обработчик, вы должны явно установить правильный статус http для объекта ответа.Если вы не установите статус, по умолчанию будет 200 OK.

def not_found(request):
    return render(request, '404.html', status=404)
...