Работа любого сайта начинается с запросов и ответов. Пользователь открывает страницу — Django получает запрос, обрабатывает его и возвращает ответ. На этом уровне и начинается настоящее взаимодействие с сервером.
В этом уроке мы подробно разберём, как Django обрабатывает GET- и POST-запросы, а также научимся работать с ошибками и исключениями. Это — основа серверной логики, без которой невозможно ни одно веб-приложение.
Начнем с самого простого — GET-запросов. Это те запросы, которые вы выполняете каждый раз, когда открываете страницу в браузере.
Например, такой URL:
http://127.0.0.1:8000/?name=Inception&category=movies
содержит два параметра:
name=Inceptioncategory=movies
После знака ? начинаются параметры, разделённые амперсандом &.
В Django все параметры GET-запроса хранятся в объекте request.GET.
Этот объект похож на словарь Python, но поддерживает дополнительные методы.
Создадим простую вьюшку в cinemahub/views.py:
from django.http import HttpResponse
def search(request):
print(request.GET) # Выводим параметры запроса в консоль
return HttpResponse("<h1>Поиск фильмов</h1>")Теперь добавим маршрут в cinemahub/urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('search/', views.search),
]Сохраняем и запускаем сервер:
python manage.py runserverОткройте в браузере:
http://127.0.0.1:8000/search/?name=Inception&category=thriller
В консоли вы увидите:
<QueryDict: {'name': ['Inception'], 'category': ['thriller']}>
А на странице — сообщение “Поиск фильмов”. Поздравляю 🎉 — вы только что выполнили свой первый GET-запрос с параметрами.
Теперь разберём POST-запросы. Они используются, когда вы отправляете данные формы, например, при регистрации пользователя, публикации комментария или добавлении фильма.
В отличие от GET, данные не видны в URL — они передаются в теле запроса.
Пример функции для обработки POST-запроса:
def add_movie(request):
if request.method == "POST":
print(request.POST)
return HttpResponse("<h1>Фильм успешно добавлен</h1>")
else:
return HttpResponse("<h1>Ожидается POST-запрос</h1>")Добавим маршрут:
path('add_movie/', views.add_movie),На этом этапе настало время познакомиться с удобным инструментом — Postman. Это программа, которая позволяет тестировать HTTP-запросы без необходимости создавать формы на сайте.
-
Установите Postman.
-
Запустите сервер Django (
python manage.py runserver). -
В Postman создайте новый запрос:
- Метод: POST
- URL:
http://127.0.0.1:8000/add_movie/
-
Перейдите во вкладку Body → form-data и добавьте поля:
title=Interstellaryear=2014
-
Нажмите Send.
В консоли вы увидите:
<QueryDict: {'title': ['Interstellar'], 'year': ['2014']}>
А в Postman вернётся ответ:
Фильм успешно добавлен
💡 Таким образом, Postman позволяет быстро проверять работу API и формировать любые запросы к вашему серверу.
Если возникает ошибка:
Forbidden (CSRF cookie not set.), временно закомментируйте мидлвар в settings.py:django.middleware.csrf.CsrfViewMiddleware
| Характеристика | GET | POST |
|---|---|---|
| Передача данных | В URL | В теле запроса |
| Безопасность | Низкая (всё видно в адресе) | Выше (данные скрыты) |
| Кэширование | Возможное | Обычно нет |
| Использование | Поиск, фильтрация | Отправка форм, добавление данных |
Объекты request.GET и request.POST реализованы на основе класса QueryDict.
Он имеет полезные методы:
def get_params(request):
name = request.GET.get('name', 'Не указано')
genres = request.GET.getlist('genre')
print(f"Название: {name}, Жанры: {genres}")
return HttpResponse("<h1>Параметры запроса обработаны</h1>")get()— возвращает одно значение по ключу.getlist()— возвращает список всех значений ключа.dict()— превращает QueryDict в обычный словарь Python.
Если пользователь перейдёт по несуществующему адресу, Django вернёт стандартную страницу с ошибкой 404. Мы можем сделать эту страницу более аккуратной и понятной.
Создадим собственный обработчик ошибки.
- В
cinemahub/views.py:
from django.http import HttpResponseNotFound
def page_not_found(request, exception):
return HttpResponseNotFound("<h1>Страница не найдена</h1>")- В
cinemahub/urls.pyдобавим:
handler404 = 'cinemahub.views.page_not_found'Теперь при попытке открыть несуществующий путь вы увидите аккуратную страницу с вашим сообщением.
В Django обработчик ошибок handler404 не срабатывает, если у вас в настройках проекта (settings.py) включён режим отладки, то есть DEBUG = True. В этом режиме Django всегда показывает свою стандартную отладочную страницу 404, чтобы помочь разработчику понять, почему не найден маршрут.
DEBUG = FalseDEBUG не возможно выставить в False без добавления разрешенных хостов в настройках
ALLOWED_HOSTS = ['localhost', '127.0.0.1']Иногда нужно сгенерировать ошибку намеренно — например, если пользователь пытается обратиться к архиву за будущий год.
from django.http import HttpResponse, Http404
def archive(request, year):
if year > 2025:
raise Http404("Этот год еще не наступил")
return HttpResponse(f"<h1>Архив фильмов за {year} год</h1>")Теперь при переходе, например, по адресу http://127.0.0.1:8000/archive/2030/ вы получите сообщение о том, что год недопустим.
Django позволяет переопределить обработчики и для других типов ошибок:
| Код | Описание | Обработчик |
|---|---|---|
| 404 | Страница не найдена | handler404 |
| 500 | Ошибка сервера | handler500 |
| 403 | Доступ запрещен | handler403 |
| 400 | Некорректный запрос | handler400 |
Пример кастомного обработчика для 500-й ошибки:
from django.http import HttpResponseServerError
def server_error(request):
return HttpResponseServerError("<h1>Ошибка на сервере</h1>")Попробуйте выполнить следующие тесты:
-
Откройте в браузере:
http://127.0.0.1:8000/search/?name=Avatar&category=sci-fiВ консоли должны появиться параметры запроса.
-
В Postman выполните POST-запрос:
URL: http://127.0.0.1:8000/add_movie/ Метод: POST Body → form-data: title=Inception, year=2010Результат — сообщение “Фильм успешно добавлен”.
-
Введите несуществующий адрес, например:
http://127.0.0.1:8000/unknown/Проверьте, что появилась страница “Страница не найдена”.
Теперь вы знаете, как Django обрабатывает GET и POST запросы, как работать с параметрами через QueryDict, и как настраивать собственные страницы ошибок.
Это мощный инструмент, который пригодится вам буквально в каждом проекте — ведь любая форма, фильтр или поиск начинается именно с обработки запроса.
- Чем GET-запрос отличается от POST-запроса?
- Как получить значение параметра из URL в Django?
- Что делает объект
QueryDict? - Почему POST-запросы считаются безопаснее GET-запросов?
- Как проверить работу POST-запроса без формы на сайте?
- Что произойдёт, если вызвать
raise Http404()внутри представления? - Как настроить собственную страницу ошибки 404?
- Для чего служит параметр
exceptionв функцииpage_not_found? - Какие ещё типы ошибок можно обработать в Django, кроме 404?
- Почему важно проверять
request.methodв представлениях?