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.
Тепер ваш сервер може не тільки приймати запити, але й гарно на них відповідати. Наступний крок — розвивати наш проєкт далі, додаючи потужний функціонал!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ