Крок 7. Async Django¶
Цей крок охоплює два самостійних проєкти: 7A (hello_app — sync vs async порівняння) та 7B (notes_chat_app — WebSocket груповий чат). Перший — standalone застосунок на SQLite під Uvicorn. Другий — production-like стек з Docker, PostgreSQL, Redis, Daphne і Django Channels.
Передумови
Перед початком переконайся, що пройдені:
- Крок 1. Hello Django — перший
HttpResponse, URL routing - Крок 2. Bootstrap Notes — ModelForm, PRG, Bootstrap CRUD
- Крок 3. CRUD і архітектура — Services & Selectors, PostgreSQL
- Крок 4. Templates і Forms — Crispy Forms, Dashboard, Context Processor
- Крок 5. Auth і Безпека — Sessions, Password Security, IDOR, Group Sharing
- Крок 6. Testing — TestCase, fixtures, Selenium
7A vs 7B: два проєкти в одному кроці¶
| 7A — hello_app | 7B — notes_chat_app | |
|---|---|---|
| Проєкт | hello_app (окремий навчальний) | notes_chat_app (production-like) |
| Запуск | uvicorn notes_project.asgi:application --port 8001 |
docker compose up --build |
| База даних | SQLite | PostgreSQL (Docker) |
| ASGI сервер | Uvicorn | Uvicorn (у Docker) |
| Channel layer | InMemoryChannelLayer | RedisChannelLayer |
| WebSocket | Демо у розділі 18 README_8 | GroupChatConsumer (повна реалізація) |
| Daphne | Необов'язково | Перший у INSTALLED_APPS |
| Redis | Не потрібен | REDIS_URL → RedisChannelLayer |
| Мета | Порівняти sync і async views архітектурно | Показати де async — єдина можлива архітектура |
Що ти вивчиш¶
Частина 7A — Async Views¶
- Чому
async def viewне стає кориснішим просто від написанняasync - Що таке lazy QuerySet і де SQL реально виконується
- Як
async forзамінюєforпри ітерації по QuerySet - Коли і чому
sync_to_asyncпотрібен дляtransaction.atomic() - Як запустити Django під ASGI через Uvicorn
- Як писати тести для async views через
AsyncClient - Що
aupdate()+F()— атомарний SQL UPDATE без завантаження об'єкта - Де async виправданий, а де — зайве ускладнення
Частина 7B — WebSocket чат¶
- Чому HTTP не підходить для real-time і де async стає необхідністю
- Що таке asyncio event loop і cooperative multitasking
- Що таке WebSocket і як він відрізняється від HTTP (handshake, постійне з'єднання)
- Що таке ASGI і чим він відрізняється від WSGI
- Як
ProtocolTypeRouterоб'єднує HTTP і WebSocket в одному ASGI-процесі - Що таке Consumer і як він відрізняється від View
- Як
AuthMiddlewareStackавтентифікує WebSocket-з'єднання - Що таке
database_sync_to_asyncі навіщо він потрібен у Consumer - Як channel layer доставляє повідомлення всім учасникам (pub/sub)
- Чому
load_historyповертаєlist, а не QuerySet - XSS захист у WebSocket клієнті:
escapeHtml() - Тестування Consumer через
WebsocketCommunicatorіTransactionTestCase
Порядок читання¶
Частина 7A — Sync vs Async Django (hello_app)¶
- 7A. Sync vs Async огляд — архітектура проєкту, файлова таблиця, sync і async request flows, коли async виправданий
- 7A. Async Views та ORM —
async_selectors.py,async_services.py,async_views.py, lazy vs evaluation,sync_to_async - 7A. Benchmark та тестування —
AsyncClient, тести sync vs async, Postman, benchmark, Docker Compose
Частина 7B — WebSocket чат (notes_chat_app)¶
- 7B. WebSocket протокол — HTTP vs WebSocket, handshake, asyncio event loop, чому sync не підходить для чату
- 7B. ASGI стек — WSGI vs ASGI,
ProtocolTypeRouter,asgi.py,routing.py,AuthMiddlewareStack - 7B. Channel Layers і Daphne — Daphne у
INSTALLED_APPS,InMemoryChannelLayervsRedisChannelLayer,socket_timeout=None - 7B. Consumer — lifecycle,
GroupChatConsumerповний код,database_sync_to_async, broadcast - 7B. WebSocket JS клієнт — Vanilla JS WebSocket API, повний клієнт, XSS захист, повний flow
- Checkpoint — чеклисти 7A і 7B, Consumer тести, типові помилки, навігація