Ласкаво просимо на лекцію про створення функцій представлень у Django.
Сьогодні ми заглибимося у практичну частину роботи з представленнями, розглянемо, як вони створюються, реєструються та взаємодіють із клієнтськими запитами. Але перш ніж починати, давайте коротко пригадаємо, що ми вивчили до цього.
Короткий зміст попередніх лекцій
Раніше ми познайомилися з основами Django: встановили проєкт, налаштували віртуальне оточення та вивчили структуру проєкту. Ви вже дізналися, як запускається локальний сервер, що робить файл manage.py, і як створювати новий додаток. На останній лекції ми обговорили, що таке представлення (views), розібралися з їхньою роллю в обробці запитів і дізналися, що представлення бувають двох типів: функціональні (FBV) та класові (CBV). Сьогодні ми зосередимося на створенні функціональних представлень.
Основи створення функцій представлень
Що таке функція представлення?
Функція представлення (function-based view, FBV) — це функція Python, яка приймає HTTP-запит (об'єкт HttpRequest) і повертає HTTP-відповідь (об'єкт HttpResponse). Представлення відповідають за обробку вхідних запитів і генерацію відповіді користувачу. Вони — міст між запитом клієнта та логікою вашого застосунку.
Простіше кажучи:
- Клієнт робить запит. Наприклад: "Гей, сервере, покажи мені головну сторінку!"
- Сервер відправляє запит до представлення.
- Представлення обробляє запит і повертає відповідь, наприклад: "Ось тобі головна сторінка, друже!"
Найпростіше представлення
Давай напишемо найпростішу функцію представлення, яка повертає текстову відповідь:
# views.py
from django.http import HttpResponse
def simple_view(request):
return HttpResponse("Привіт! Це моє перше представлення.")
Тут:
simple_view— це наша функція представлення.request— об'єкт, що представляє клієнтський HTTP-запит.HttpResponse— об'єкт, який ми повертаємо клієнту. Він містить нашу відповідь: рядок "Привіт! Це моє перше представлення."
Реєстрація функції представлення
Створене представлення нічого не знає про запити, доки ми не зв'яжемо його з URL. Для цього використовується файл urls.py.
Приклад:
# urls.py
from django.urls import path
from . import views # Імпортуємо наше представлення
urlpatterns = [
path('', views.simple_view, name='home'), # Зв'язуємо URL з представленням
]
Тут:
path()зв'язує URL-адресу (у цьому випадку порожній шлях,/) з функцією представленняsimple_view.name='home'— іменований маршрут, який ми можемо використовувати для отримання посилання на цей шлях у шаблонах.
Тепер, якщо ви відкриєте у браузері http://127.0.0.1:8000/, ви побачите наш текст "Привіт! Це моє перше представлення".
Приклади простих функцій представлень
Повернення HTML-відповіді
Давайте ускладнимо задачу і повернемо не тільки текст, але й HTML-сторінку:
# views.py
def html_view(request):
html_content = "<h1>Ласкаво просимо на мій сайт!</h1><p>Це приклад представлення, яке повертає HTML.</p>"
return HttpResponse(html_content)
Тепер додамо новий маршрут у urls.py:
# urls.py
urlpatterns = [
path('html/', views.html_view, name='html_view'),
]
Якщо ви відкриєте в браузері http://127.0.0.1:8000/html/, то побачите сторінку з заголовком і текстом!
Робота з параметрами у запитах
Іноді нам потрібно приймати параметри від користувача. Наприклад, привітати його за ім'ям:
# views.py
def greet_user(request, name):
return HttpResponse(f"<h1>Привіт, {name}!</h1><p>Радий вас бачити.</p>")
У файл urls.py додаємо маршрут з динамічним параметром:
# urls.py
urlpatterns = [
path('greet/<str:name>/', views.greet_user, name='greet_user'),
]
Тепер, якщо ви зайдете на http://127.0.0.1:8000/greet/Олексій/, побачите повідомлення: "Привіт, Олексій! Радий вас бачити." Параметр <str:name> дозволяє передавати рядок у нашу функцію представлення.
Обробка помилок і повернення статус-кодів
Повертаємо статус-коди
Іноді сервер має повернути не лише текст, але й певний HTTP-статус-код. Наприклад, у разі помилки:
# views.py
def error_view(request):
return HttpResponse("Щось пішло не так!", status=500)
Тут ми повертаємо статус 500 (Server Error), що вказує на те, що на сервері щось зламалося. Ви можете вказати будь-який статус-код, наприклад 404, 403 тощо.
Обробка помилок 404
У Django зручно обробляти помилки 404, якщо користувач зайшов на неіснуючу сторінку. Для цього можна використати спеціальне представлення:
# views.py
from django.http import Http404
def page_not_found_view(request):
raise Http404("Такої сторінки не існує!")
У разі виникнення помилки 404 Django покаже стандартну сторінку "404 Not Found".
Бонус: робота з методами HTTP-запитів
Ти можеш перевіряти метод запиту, щоб по-різному обробляти GET і POST:
# views.py
def method_view(request):
if request.method == 'GET':
return HttpResponse("Це GET-запит")
elif request.method == 'POST':
return HttpResponse("Це POST-запит")
else:
return HttpResponse(f"Метод {request.method} не підтримується.", status=405)
Додаємо маршрут:
# urls.py
urlpatterns = [
path('method/', views.method_view, name='method_view'),
]
Тепер:
http://127.0.0.1:8000/method/з методом GET поверне: "Це GET-запит".- Якщо надіслати POST-запит, ти отримаєш: "Це POST-запит".
Типові помилки та поради
Не забувайте реєструвати представлення у
urls.py. Часто буває так, що ви написали представлення, але забули створити для нього маршрут. Перевірте список маршрутів, якщо ваша сторінка не працює.Слідкуйте за іменами функцій. Функції представлень не повинні мати однакові імена, інакше виникне конфлікт.
Використовуйте іменовані маршрути. Це зробить ваш код більш читабельним і полегшить зміни у майбутньому.
Не ігноруйте статус-коди. Коректні статус-коди допомагають зрозуміти, що відбувається на сервері. Наприклад, повертайте 404 для неіснуючих сторінок, а 405 для непідтримуваних методів запитів.
Приклад: простий веб-додаток з кількома маршрутами
Давайте об'єднаємо все, що вивчили, в одному міні-додатку:
# views.py
from django.http import HttpResponse, Http404
def home(request):
return HttpResponse("Головна сторінка: Ласкаво просимо!")
def greet_user(request, name):
return HttpResponse(f"<h1>Привіт, {name}!</h1>")
def not_found(request):
raise Http404("Ця сторінка не знайдена!")
def method_view(request):
if request.method == 'GET':
return HttpResponse("Це GET-запит")
elif request.method == 'POST':
return HttpResponse("Це POST-запит")
else:
return HttpResponse("Метод не підтримується.", status=405)
# urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.home, name='home'),
path('greet/<str:name>/', views.greet_user, name='greet_user'),
path('error/', views.not_found, name='not_found'),
path('method/', views.method_view, name='method_view'),
]
Тепер у нас є:
- Головна сторінка.
- Привітання користувача.
- Обробка помилок 404.
- Приклад роботи з методами HTTP.
Запустіть сервер, протестуйте додаток та насолоджуйтесь результатами!
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ