Django поднимает исключение для ошибки wont override для HttpResponse
Я использую Django для создания пользовательских обработчиков страниц ошибок 400, 403, 404, 500. Но по какой-то причине, когда страница возвращает ошибку HttpResponse, она не направляет меня на мою страницу шаблона ошибки django, вместо этого она показывает следующее. Этот django может найти url и перейти в функцию просмотра, но мы возвращаем HttpResponse 404 он не найден.
Например, http://127.0.0.1:8000/404/, это приведет к странице настройки, потому что Django не может найти этот url в нашем проекте
### views.py
from django.shortcuts import render
def page_not_found_view(request, exception):
return render(request, 'error.html',status = 404,context = {
'status_code' : 404,
'message' : "The page you were looking for doesn't exist anymore.",
'title' : "Page Not Found"
})
def internal_server_error_view(request, *args, **argv):
return render(request, 'error.html',status = 500,context = {
'status_code' : 500,
'message' : "500 Internal Server Error.",
'title' : "Internal Server Error"
})
def forbidden_error_view(request, exception):
return render(request, 'error.html',status = 403,context = {
'status_code' : 403,
'message' : "403 Forbidden Error.",
'title' : "Forbidden Error"
})
def bad_request_error_view(request, exception):
return render(request, 'error.html',status = 400,context = {
'status_code' : 400,
'message' : "400 Bad Request Error.",
'title' : "Bad Request"
})
### urls.py
hanlder400 = "gotani.views.bad_request_error_view"
handler404 = "gotani.views.page_not_found_view"
handler403 = "gotani.views.forbidden_error_view"
handler500 = "gotani.views.internal_server_error_view"
Из документации:
Для удобства и потому, что неплохо иметь согласованную страницу ошибки 404 на всем вашем сайте, Django предоставляет исключение Http404. Если вы поднимете Http404 в любой точке функции представления, Django поймает его и вернет стандартную страницу ошибки для вашего приложения вместе с HTTP кодом ошибки 404.
Вместо render
используйте raise
. Вы можете использовать raise
с различными типами ошибок, и он будет получать правильную страницу ошибки.
raise Http404("Poll does not exist")
Помните, что для этого нет необходимости использовать внешние пакеты. Вы можете просто добавить страницу 404.html
на уровне корня шаблона, и Django будет автоматически обслуживать ее, когда встретит 404 error
. То же самое справедливо и для других кодов ошибок.