При разработке в Django часто возникает необходимость показывать настраиваемую страницу 404 с помощью кода raise Http404("Page not found.")
.
В этой статье мы практично рассмотрим причины возникновения ошибки 404, методы подключения шаблонов и обработку ошибок 403/500.
1. Основные способы возникновения ошибки 404
Я классифицировал случаи возникновения ошибки 404 в Django, и, вероятно, это около четырех способов.
1. raise Http404("описание")
Это самый простой способ явно вызвать ошибку 404.
from django.http import Http404
def my_view(request):
if not condition:
raise Http404("Page not found.")
2. get_object_or_404()
Это часто используемая в Django сокращенная функция. Она автоматически вызывает 404, если объект отсутствует.
from django.shortcuts import get_object_or_404
post = get_object_or_404(Post, pk=pk)
3. Обработка исключений после использования Model.objects.get()
В этом случае также нужно вручную вызывать 404.
from django.http import Http404
from django.core.exceptions import ObjectDoesNotExist
try:
post = Post.objects.get(pk=pk)
except ObjectDoesNotExist:
raise Http404("Post not found.")
4. Когда URLConf или View не существует
В отличие от предыдущих способов, это не ошибка, вызванная намеренно разработчиком, но если пользователь обращается к несуществующему URL, Django автоматически генерирует 404.
2. Способы кастомизации
Обязательные условия
- Имя шаблона обязательно должно быть
404.html
. - В
settings.py
должны быть установлены следующие параметры: DEBUG = False
- Настройка
ALLOWED_HOSTS
- Шаблон
404.html
должен находиться в доступном Django месте.
Расположение шаблона
Место | Описание |
---|---|
путь_проекта/templates/404.html |
Наиболее распространенное и надежное место |
имя_приложения/templates/404.html |
Возможно, но требуется условие APP_DIRS = True |
имя_приложения/templates/имя_приложения/errors/404.html |
Не обнаруживается автоматически, требуется установка handler404 |
handler404
пример ручного подключения
# views.py
def custom_404_view(request, exception):
return render(request, 'myapp/errors/404.html', status=404)
# urls.py
handler404 = 'myapp.views.custom_404_view'
3. Возможно ли кастомизировать ошибки 403 и 500?
✔ Django позволяет кастомизировать страницы ошибок, помимо 404, для следующих кодов ошибок:
Код ошибки | Имя шаблона по умолчанию | Описание |
---|---|---|
403 | 403.html |
Отказ в доступе (Permission Denied) |
404 | 404.html |
Страница не найдена (Not Found) |
500 | 500.html |
Внутренняя ошибка сервера (Internal Server Error) |
400 | 400.html |
Необработанный запрос (Bad Request) |
✔ Основные условия те же
- Шаблон будет применен только если
DEBUG = False
. - Шаблон должен находиться по пути
TEMPLATES['DIRS']
илиAPP_DIRS=True
. - При необходимости можно вручную зарегистрировать
handler403
,handler400
,handler500
для подключения к конкретному представлению.
Подведение итогов
Элемент | Содержание |
---|---|
При использовании raise Http404 |
Автоматическая отрисовка шаблона 404.html |
get_object_or_404() |
Автоматически вызывает 404, если объект отсутствует |
Имя шаблона | Обязательно используйте фиксированные имена, такие как 404.html , 403.html |
Условия для директории | Должно находиться внутри TEMPLATES['DIRS'] или APP_DIRS |
Условия DEBUG | Пользовательские шаблоны применяются только при DEBUG = False |
Расширенное использование | Возможно подключение к конкретному представлению с помощью handler404 , handler500 |
Комментариев нет.