Я пытаюсь обслуживать пользовательские страницы ошибок в моем приложении Django, работающем под NGINX. У меня есть URL-адреса, определенные для четырех страниц, и переход к ним прошел успешно; он показывает соответствующую страницу с соответствующим кодом состояния. Однако проблема возникает, когда я пытаюсь выдать ошибку обычными средствами. Например, когда я пытаюсь получить доступ к ограниченному файлу, я вижу правильный код состояния (403) на сетевой панели Firefox, но я вижу не страницу ошибок NGINX по умолчанию или свою пользовательскую страницу, а пустую белую страницу.
Вот моя конфигурация NGINX (v1.14.2):
server {
listen 80;
server_name my_IP;
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
error_page 400 /400;
error_page 403 /403;
error_page 404 /404;
error_page 500 /500;
location = /favicon.ico {
root /home/matt/my-project/staticfiles/home/img;
#access_log off;
#log_not_found off;
}
location /static {
alias /home/matt/my-project/staticfiles;
}
location /media {
root /home/matt/my-project;
}
}
И мой источник Django (v3.0.5):
проект / urls.py
from django.contrib import admin
from django.urls import path, include
from django.conf.urls import (
handler400,
handler403,
handler404,
handler500,
)
from django.conf.urls.static import static
from mtm.settings import DEBUG, MEDIA_URL, MEDIA_ROOT
urlpatterns = [
path('', include(('home.urls', 'home'), namespace='home')),
path('', include(('users.urls', 'users'), namespace='users')),
path('', include(('locations.urls', 'locations'), namespace='locations')),
path('', include(('events.urls', 'events'), namespace='events')),
path('images/', include(('images.urls', 'images'), namespace='images')),
path('articles/', include(('articles.urls', 'articles'), namespace='articles')),
path('admin/', admin.site.urls),
]
if DEBUG:
urlpatterns += static(MEDIA_URL, document_root=MEDIA_ROOT)
handler400 = 'home.views.handler400'
handler403 = 'home.views.handler403'
handler404 = 'home.views.handler404'
handler500 = 'home.views.handler500'
главная / urls.py
from django.urls import path, re_path
from . import views
from mtm.settings import DEBUG
urlpatterns = [
path('', views.index, name='index'),
re_path(r'^400/', views.handler400),
re_path(r'^403/', views.handler403),
re_path(r'^404/', views.handler404),
re_path(r'^500/', views.handler500),
path('about/', views.about, name='about'),
path('people-to-know/', views.people, name='people-to-know'),
path('create-person/', views.create_person, name='create-person'),
re_path(r'update-person/(?P<person_id>[1-9]\d*)/', views.update_person, name='update-person'),
re_path(r'delete-person/(?P<person_id>[1-9]\d*)/', views.delete_person, name='delete-person'),
path('news-feed/', views.news_feed, name='news-feed'),
re_path(r'^(?P<slug>(nightlife|restaurants|nightlife-restaurants|arts-and-entertainment|health-and-fitness|sports|non-profit))/$', views.category, name='category'),
]
главная / views.py
# imports
def handler400(request, exception=None):
return render(request, 'home/errors/400.html', status=400)
def handler403(request, exception=None):
return render(request, 'home/errors/403.html', status=403)
def handler404(request, exception=None):
return render(request, 'home/errors/404.html', status=404)
def handler500(request, exception=None):
return render(request, 'home/errors/500.html', status=500)
# other views
Любая помощь приветствуется!
Вызываемый объект или строка, представляющая полный путь импорта Python к представлению, которое должно быть вызвано, если HTTP-клиент отправил запрос, вызвавший состояние ошибки, и ответ с кодом состояния 400.
Есть еще один вариант для настройки функции обработчика ошибок, то есть вызываемый.
Функции обработчика ошибок по умолчанию в django
Кстати, вставка curl -vvv your-site.com/404
вывод команды здесь был бы лучше.