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.StreamingHttpResponsedjango.db.models.signals.post_save, django.dispatch.Signal)event:, data:, id:, retry:): co kilkanaście sekund).