Я нахожусь в ад 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 здесь и здесь .Само собой разумеется, что эти неправильные конфигурации были очень разными, не показывая ни одного из симптомов, которые я вижу.