Skip to content

Latest commit

 

History

History
309 lines (202 loc) · 12.2 KB

File metadata and controls

309 lines (202 loc) · 12.2 KB

Модуль 1. Урок 5. GET и POST-запросы. Обработка ошибок запросов

Работа любого сайта начинается с запросов и ответов. Пользователь открывает страницу — Django получает запрос, обрабатывает его и возвращает ответ. На этом уровне и начинается настоящее взаимодействие с сервером.

В этом уроке мы подробно разберём, как Django обрабатывает GET- и POST-запросы, а также научимся работать с ошибками и исключениями. Это — основа серверной логики, без которой невозможно ни одно веб-приложение.


GET-запросы — данные в адресной строке

Начнем с самого простого — GET-запросов. Это те запросы, которые вы выполняете каждый раз, когда открываете страницу в браузере.

Например, такой URL:

http://127.0.0.1:8000/?name=Inception&category=movies

содержит два параметра:

  • name=Inception
  • category=movies

После знака ? начинаются параметры, разделённые амперсандом &.


Обработка GET-запроса в Django

В 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-запросы — передача данных “внутри” запроса

Теперь разберём 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

На этом этапе настало время познакомиться с удобным инструментом — Postman. Это программа, которая позволяет тестировать HTTP-запросы без необходимости создавать формы на сайте.

  1. Установите Postman.

  2. Запустите сервер Django (python manage.py runserver).

  3. В Postman создайте новый запрос:

    • Метод: POST
    • URL: http://127.0.0.1:8000/add_movie/
  4. Перейдите во вкладку Body → form-data и добавьте поля:

    • title = Interstellar
    • year = 2014
  5. Нажмите Send.

В консоли вы увидите:

<QueryDict: {'title': ['Interstellar'], 'year': ['2014']}>

А в Postman вернётся ответ:

Фильм успешно добавлен

💡 Таким образом, Postman позволяет быстро проверять работу API и формировать любые запросы к вашему серверу.

Если возникает ошибка: Forbidden (CSRF cookie not set.), временно закомментируйте мидлвар в settings.py: django.middleware.csrf.CsrfViewMiddleware


Отличие GET от POST

Характеристика GET POST
Передача данных В URL В теле запроса
Безопасность Низкая (всё видно в адресе) Выше (данные скрыты)
Кэширование Возможное Обычно нет
Использование Поиск, фильтрация Отправка форм, добавление данных

Работа с параметрами через QueryDict

Объекты 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.

Ошибка 404: страница не найдена

Если пользователь перейдёт по несуществующему адресу, Django вернёт стандартную страницу с ошибкой 404. Мы можем сделать эту страницу более аккуратной и понятной.

Создадим собственный обработчик ошибки.

  1. В cinemahub/views.py:
from django.http import HttpResponseNotFound

def page_not_found(request, exception):
    return HttpResponseNotFound("<h1>Страница не найдена</h1>")
  1. В cinemahub/urls.py добавим:
handler404 = 'cinemahub.views.page_not_found'

Теперь при попытке открыть несуществующий путь вы увидите аккуратную страницу с вашим сообщением.


Дополнительные настройки, что бы кастомная страница 404 отображалась

В Django обработчик ошибок handler404 не срабатывает, если у вас в настройках проекта (settings.py) включён режим отладки, то есть DEBUG = True. В этом режиме Django всегда показывает свою стандартную отладочную страницу 404, чтобы помочь разработчику понять, почему не найден маршрут.

DEBUG = False

DEBUG не возможно выставить в 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>")

Проверка результата

Попробуйте выполнить следующие тесты:

  1. Откройте в браузере:

    http://127.0.0.1:8000/search/?name=Avatar&category=sci-fi
    

    В консоли должны появиться параметры запроса.

  2. В Postman выполните POST-запрос:

    URL: http://127.0.0.1:8000/add_movie/
    Метод: POST
    Body → form-data: title=Inception, year=2010
    

    Результат — сообщение “Фильм успешно добавлен”.

  3. Введите несуществующий адрес, например:

    http://127.0.0.1:8000/unknown/
    

    Проверьте, что появилась страница “Страница не найдена”.


Заключение

Теперь вы знаете, как Django обрабатывает GET и POST запросы, как работать с параметрами через QueryDict, и как настраивать собственные страницы ошибок. Это мощный инструмент, который пригодится вам буквально в каждом проекте — ведь любая форма, фильтр или поиск начинается именно с обработки запроса.


Вопросы для самопроверки

  1. Чем GET-запрос отличается от POST-запроса?
  2. Как получить значение параметра из URL в Django?
  3. Что делает объект QueryDict?
  4. Почему POST-запросы считаются безопаснее GET-запросов?
  5. Как проверить работу POST-запроса без формы на сайте?
  6. Что произойдёт, если вызвать raise Http404() внутри представления?
  7. Как настроить собственную страницу ошибки 404?
  8. Для чего служит параметр exception в функции page_not_found?
  9. Какие ещё типы ошибок можно обработать в Django, кроме 404?
  10. Почему важно проверять request.method в представлениях?

Предыдущий урок | Следующий урок