JavaRush /Курсы /Модуль 3: Django /Понятие HTTP-запросов и ответов

Понятие HTTP-запросов и ответов

Модуль 3: Django
3 уровень , 7 лекция
Открыта

HTTP (HyperText Transfer Protocol) — это основа общения между клиентом (например, вашим браузером) и сервером (например, нашим Django-приложением). Когда вы отправляете запрос через браузер, ваш клиент формирует HTTP-запрос, который сервер обрабатывает и на основе которого формирует HTTP-ответ.

Пример запроса, который вы отправляете каждый день:

  • Вы вбиваете в адресную строку https://example.com/articles/42.
  • Браузер отправляет HTTP-запрос на сервер.
  • Сервер решает, что там спрятано под /articles/42, и возвращает соответствующий ответ (например, HTML-страничку с нужной вам статьей).

Простыми словами, клиент говорит серверу:
"Эй, дай мне данные по этому адресу!"
А сервер отвечает: "Вот, держи!", либо: "Извините, ничего не нашел!" (привет, 404).

Структура HTTP-запроса

HTTP-запрос состоит из:

  1. Метода запроса — указывает серверу, что нужно сделать с ресурсом (например, прочитать, обновить или удалить).
  2. URL или URI — это часть после имени домена. Например, в https://example.com/articles/42 путь к ресурсу — /articles/42.
  3. Заголовков — содержат дополнительную информацию, такую как тип данных (Content-Type), язык (Accept-Language), авторизация и прочее.
  4. Тела запроса (необязательно) — содержит данные, которые вы отправляете на сервер (например, данные формы).

Пример HTTP-запроса на языке "человеческого":

GET /articles/42 HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Accept-Language: en-US

Методы HTTP-запросов

Django (как и любой веб-фреймворк) понимает основные методы HTTP:

  • GET: чаще всего используется для получения данных. Например, при загрузке статей или просмотре страницы.
  • POST: используется для отправки данных на сервер. Например, вы отправляете форму регистрации.
  • PUT: обновляет данные на сервере.
  • DELETE: удаляет данные с сервера.
  • PATCH: обновляет часть данных на сервере.

Пример: представьте, что вы заказали гамбургер.

  • GET — это когда вы спрашиваете, какие гамбургеры есть в меню.
  • POST — это заказ гамбургера.
  • PUT — это если вы решите поменять начинку в заказанном гамбургере.
  • DELETE — это отмена вашего заказа.

Пример использования метода GET

Создадим простое представление, которое возвращает список статей:

from django.http import JsonResponse

# Функция представления
def articles_list(request):
    if request.method == "GET":  # Проверяем метод запроса
        articles = [
            {"id": 1, "title": "Как выучить Django"},
            {"id": 2, "title": "Секреты HTTP-протокола"},
        ]
        return JsonResponse(articles, safe=False)
    else:
        return JsonResponse({"error": "Метод не поддерживается"}, status=405)

Добавим маршрут для этого представления в urls.py:

from django.urls import path
from .views import articles_list

urlpatterns = [
    path('articles/', articles_list, name='articles_list'),
]

Теперь, если вы отправите GET-запрос на /articles/, сервер вернет вам список статей в формате JSON. А если вы вдруг попробуете POST, получите ошибку 405.

Пример использования метода POST

Теперь добавим возможность добавления статьи через POST-запрос.

import json
from django.http import JsonResponse

# Функция представления
def create_article(request):
    if request.method == "POST":
        try:
            body = json.loads(request.body)  # Читаем тело запроса
            title = body.get("title")
            if not title:
                return JsonResponse({"error": "Поле 'title' обязательно"}, status=400)
            # В реальных проектах тут записываем статью в базу данных
            return JsonResponse({"message": f"Статья '{title}' создана!"}, status=201)
        except json.JSONDecodeError:
            return JsonResponse({"error": "Неправильный формат JSON"}, status=400)
    else:
        return JsonResponse({"error": "Метод не поддерживается"}, status=405)

И добавим маршрут:

urlpatterns += [
    path('create-article/', create_article, name='create_article'),
]

Теперь вы можете отправить POST-запрос с телом:

{
    "title": "Новая статья о Django!"
}

И сервер ответит: "Статья 'Новая статья о Django!' создана!". Записывать в базу пока не будем — это тема для будущих лекций.

Что такое HTTP-ответ?

После получения запроса ваш сервер возвращает HTTP-ответ клиенту. Ответы содержат следующее:

  1. Статус-код — указывает результат обработки запроса (например, 200 — всё ок, 404 — не найдено).
  2. Заголовки — дополнительная информация (например, тип контента или длина ответа).
  3. Тело ответа — сами данные, которые клиент запрашивал (например, HTML-страница или JSON).

Пример HTTP-ответа на языке "человеческого":

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 50

{"id": 1, "title": "Как выучить Django"}

Работа с HTTP-ответами в Django

Django предоставляет вам возможность возвращать данные через HttpResponse и его производные, такие как JsonResponse.

Пример простого HTTP-ответа

from django.http import HttpResponse

def simple_response(request):
    return HttpResponse("Привет, я простой HTTP-ответ!")

И добавим маршрут:

urlpatterns += [
    path('simple-response/', simple_response, name='simple_response'),
]

Открыв /simple-response/, вы увидите текстовое сообщение.

Возврат статус-кодов

Возвращайте статус-коды, чтобы клиентам (и их разработчикам) было проще разобраться, что пошло не так.

from django.http import HttpResponse

def custom_status(request):
    return HttpResponse("Всё нормально, но это кастомный статус", status=201)

Маршрут:

urlpatterns += [
    path('custom-status/', custom_status, name='custom_status'),
]

Здесь сервер вернет статус-код 201 (Created).

JSON-ответы

Для работы с API мы часто возвращаем данные в формате JSON (спасибо JsonResponse).

from django.http import JsonResponse

def json_view(request):
    data = {"message": "Привет, это JSON-ответ!"}
    return JsonResponse(data)

Маршрут:

urlpatterns += [
    path('json/', json_view, name='json_view'),
]

Эндпоинт /json/ вернет JSON-объект.

Обработка ошибок

404: "Страница не найдена"

Если пользователь стучится в дверь вашего приложения не туда (например, /abracadabra/), сервер вернет статус-код 404. Вы можете кастомизировать эту страницу.

В проекте создайте 404.html внутри папки templates/:

<h1>Упс, страница не найдена!</h1>
<p>Кажется, вы заблудились. Попробуйте вернуться назад.</p>

Django автоматически покажет этот шаблон для всех 404 ошибок.

500: "Внутренняя ошибка сервера"

Когда что-то идет не так на сервере, пользователь видит страницу 500. Создайте шаблон 500.html в templates/:

<h1>Ой, что-то сломалось!</h1>
<p>Мы уже работаем над исправлением.</p>

Также Django автоматически подхватит этот шаблон.

Подведем промежуточные итоги

Сегодня мы копнули глубже в то, как Django работает с HTTP-запросами и ответами. Узнали про методы GET и POST, разобрались со статус-кодами, JSON-ответами и даже научились обрабатывать ошибки 404 и 500.

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

1
Задача
Модуль 3: Django, 3 уровень, 7 лекция
Недоступна
JSON-ответ
JSON-ответ
1
Задача
Модуль 3: Django, 3 уровень, 7 лекция
Недоступна
Обработка метода POST
Обработка метода POST
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Ivan Уровень 59
27 июня 2025
> Пример HTTP-ответа на языке "человеческого": А эта фраза на каком языке?