HTTP (HyperText Transfer Protocol) — это основа общения между клиентом (например, вашим браузером) и сервером (например, нашим Django-приложением). Когда вы отправляете запрос через браузер, ваш клиент формирует HTTP-запрос, который сервер обрабатывает и на основе которого формирует HTTP-ответ.
Пример запроса, который вы отправляете каждый день:
- Вы вбиваете в адресную строку
https://example.com/articles/42. - Браузер отправляет HTTP-запрос на сервер.
- Сервер решает, что там спрятано под
/articles/42, и возвращает соответствующий ответ (например, HTML-страничку с нужной вам статьей).
Простыми словами, клиент говорит серверу:
"Эй, дай мне данные по этому адресу!"
А сервер отвечает: "Вот, держи!", либо: "Извините, ничего не нашел!" (привет, 404).
Структура HTTP-запроса
HTTP-запрос состоит из:
- Метода запроса — указывает серверу, что нужно сделать с ресурсом (например, прочитать, обновить или удалить).
- URL или URI — это часть после имени домена. Например, в
https://example.com/articles/42путь к ресурсу —/articles/42. - Заголовков — содержат дополнительную информацию, такую как тип данных (
Content-Type), язык (Accept-Language), авторизация и прочее. - Тела запроса (необязательно) — содержит данные, которые вы отправляете на сервер (например, данные формы).
Пример 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-ответ клиенту. Ответы содержат следующее:
- Статус-код — указывает результат обработки запроса (например, 200 — всё ок, 404 — не найдено).
- Заголовки — дополнительная информация (например, тип контента или длина ответа).
- Тело ответа — сами данные, которые клиент запрашивал (например, 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.
Теперь ваш сервер может не только принимать запросы, но и красиво на них отвечать. Следующий шаг — развивать наш проект дальше, добавляя мощный функционал!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ