Dotychczas nasz “Interaktywny Edytor Tras/Ścieżek” ewoluował od prostego edytora na statycznym obrazie do narzędzia pozwalającego definiować dynamiczne plansze do gry “Połącz Kropki” oraz rysować na nich indywidualne ścieżki przez użytkowników. Zaimplementowaliśmy interaktywny frontend w TypeScript oraz backend w Django do zarządzania danymi.
W tym laboratorium wprowadzimy nowy element: powiadomienia w czasie rzeczywistym. Chcemy, aby użytkownicy byli informowani o pewnych zdarzeniach w systemie bez konieczności odświeżania strony. Idealnym narzędziem do tego celu, ze względu na jednokierunkową komunikację serwer-klient, jest technologia Server-Sent Events (SSE).
Celem tej części laboratorium jest zaimplementowanie po stronie serwera (Django) mechanizmu wysyłania zdarzeń (SSE) informujących aktywnych klientów o dwóch typach zdarzeń:
/sse/notifications/
), który będzie odpowiedzialny za strumieniowanie zdarzeń do klienta.StreamingHttpResponse
z Content-Type ustawionym na text/event-stream
.post_save
) dla modelu Board
(planszy z Lab 9). Po pomyślnym utworzeniu nowego obiektu Board
, serwer powinien wysłać zdarzenie SSE.post_save
) dla modelu Path
(ścieżki z Lab 10). Po pomyślnym utworzeniu nowego obiektu Path
, serwer powinien wysłać zdarzenie SSE.event: newBoard
)data: {"board_id": 123, "board_name": "Plansza testowa", "creator_username": "autorX"}
)event: newPath
)data: {"path_id": 456, "board_id": 789, "board_name": "Plansza zagadka", "user_username": "graczY"}
)/sse/notifications/
. Rozważ, jak będziesz zarządzać listą aktywnych połączeń lub kolejką zdarzeń do wysłania. (Uwaga: dla celów laboratoryjnych można zacząć od prostszych rozwiązań, ale warto mieć świadomość wyzwań związanych ze skalowalnością).Testowanie implementacji backendu:
Zanim przejdziesz do części frontendowej, kluczowe jest przetestowanie, czy Twój endpoint SSE działa poprawnie. Możesz to zrobić za pomocą narzędzia curl
w terminalu:
Otwórz okno terminala i wykonaj polecenie, aby nasłuchiwać na strumieniu zdarzeń (zakładając, że endpoint to /sse/notifications/
a serwer działa na localhost:8000
):
curl -N http://localhost:8000/sse/notifications/
Flaga -N
(lub --no-buffer
) jest ważna, aby curl
wyświetlał dane natychmiast po ich otrzymaniu, bez buforowania.
Aby zobaczyć również nagłówki HTTP odpowiedzi (w tym kluczowy Content-Type: text/event-stream
), użyj:
curl -i -N http://localhost:8000/sse/notifications/
curl
nasłuchujący w jednym terminalu, w innym oknie przeglądarki (lub przez panel administracyjny Django) wykonaj akcję, która powinna wygenerować zdarzenie (np. utwórz nową planszę).Obserwuj wyjście w terminalu z curl
. Powinieneś zobaczyć dane wysyłane przez serwer w formacie SSE, np.:
event: newBoard
data: {"board_id": 1, "board_name": "Nowa Plansza z Admina", "creator_username": "admin"}
Jeśli zaimplementowałeś komentarze keep-alive, one również powinny się pojawiać.
Wskazówki technologiczne:
django.http.StreamingHttpResponse
django.db.models.signals.post_save
, django.dispatch.Signal
)event:
, data:
, id:
, retry:
):
co kilkanaście sekund).