Я сделал кастомную страницу 404 в django. И я намеренно пытаюсь получить страницу с ошибкой 404.
myproject / urls.py:
from website.views import customhandler404, customhandler500, test
urlpatterns = [
re_path(r'^admin/', admin.site.urls),
re_path(r'^test/$', test, name='test'),
]
handler404 = customhandler404
handler500 = customhandler500
сайт / views.py
def customhandler404(request):
response = render(request, '404.html',)
response.status_code = 404
return response
def customhandler500(request):
response = render(request, '500.html',)
response.status_code = 500
return response
def test(request):
raise Http404('hello')
Но когда я иду 127.0.0.1:8000/test/, похоже, возвращает 500.html
И терминал говорит:
[24/Mar/2018 22:32:17] "GET /test/ HTTP/1.1" 500 128
Как я могу намеренно получить страницу 404?
Я только что отредактировал свой ответ, надеюсь, он все еще будет вам полезен.





Когда вы устанавливаете отладку на False, у вас нет настраиваемого обработчика, а код состояния ответа - 404, используется 404.html (если есть) в вашем базовом каталоге шаблонов. Чтобы вернуть ответ со статусом 404, вы можете просто вернуть экземпляр django.http.HttpResponseNotFound. Причина, по которой вы получили 500, заключается в том, что вы вызвали ошибку вместо того, чтобы вернуть ответ. Итак, ваша тестовая функция может быть просто изменена на эту
from django.http import HttpResponseNotFound
def test(request):
return HttpResponseNotFound("hello")
Обновлять:
Итак, оказалось, что причина, по которой вы получаете ошибку 500, заключалась не в том, что вы создали исключение, а в неправильных сигнатурах функций. Когда я ответил на этот вопрос более полугода назад, я забыл, что django перехватывает для вас исключение HTTP404. Однако представление обработчика имеет другие сигнатуры, чем обычные представления. Обработчик по умолчанию для 404 - defaults.page_not_found(request, exception, template_name='404.html'), который принимает 3 аргумента. Итак, ваш собственный обработчик на самом деле должен быть
def customhandler404(request, exception, template_name='404.html'):
response = render(request, template_name)
response.status_code = 404
return response
Хотя в этом случае вы можете просто использовать обработчик по умолчанию.
По поводу HttpResponseNotFound вообще лучше Http404исключение поднять. Таким образом, вам нужно определить шаблон только один раз (404.html, если он не отменен).
Если вы посмотрите свои журналы / электронную почту администратора или включите отладку, трассировка должна сообщить вам причину ошибки 500. Возможно, вы забыли импортный
from django.http import Http404. Обратите внимание, что обработчики 404 и 500 по умолчанию уже будут отображать шаблоны404.htmlи500.htmlсоответственно, поэтому вы можете просто удалить свои собственные обработчики. Не рекомендуется использоватьrenderдля страницы 500, поскольку ошибка может повториться при попытке визуализации шаблона500.html.