Quiz server
Datum: 2026-03-05
Lektor: David Slavíček
Zápis: Hana Štamberková
Pátý sraz začal s menším zpožděním kvůli absenci vstupní karty, situace se však rychle vyřešila.
Hlavním cílem lekce bylo projít repozitář quiz-server a vysvětlit si jeho architekturu a princip fungování. Na závěr lektor stručně zmínil principy agilního vývoje a naplánoval review pull requestů od Janči D.
Na příští lekci bychom se měli věnovat repozitáři common.
Přehled projektu Quiz server
Projekt je postaven jako asynchronní WebSocket server pomocí frameworku FastAPI.
Repozitář obsahuje dva hlavní Python moduly:
main.py
models.py
Modul models.py
Modul obsahuje doménové modely aplikace – reprezentaci hráčů a výsledků kvízu.
class Player
Třída Player reprezentuje jednoho hráče.
Server si u hráče uchovává:
- jméno hráče
- informaci, zda má aktuálně povoleno odpovídat (
is_allowed_answer, výchozí hodnotaFalse)
Třída obsahuje asynchronní metody:
sendclose_connection
class Players
Třída Players:
- uchovává seznam hráčů
- umožňuje přidávat a odebírat hráče
- umožňuje povolit odpovídání všem hráčům
- odesílá data všem hráčům
- uzavírá spojení se všemi hráči
class Results
Třída Results slouží pro práci s výsledky kvízu.
Obsahuje metody:
check_answeras_list
Používá se také ClassVar.
Modul main.py
V modulu main.py se inicializuje stav aplikace:
app.state.players = Players()
app.state.results = Results()
WebSocket endpoint /connect/{player_name}
Tento endpoint slouží pro připojení hráčů ke kvízu.
Po připojení server:
- zkontroluje, zda existuje aktivní kvíz
- pokud kvíz neexistuje, spojení se uzavře a hráč je informován, že kvíz ještě nezačal
- pokud kvíz existuje:
- odešle jeho název
- vytvoří objekt
Player
Odpojení hráče je ošetřeno pomocí bloku try / except.
WebSocket endpoint /admin
Endpoint slouží pro připojení administrátora kvízu.
Po připojení:
- admin odešle JSON s definicí kvízu
- kvíz je uložen jako objekt
Quiz
Výpadek administrátora je ošetřen a zaznamenán do logu.
Nové pojmy
%s– používá se v loggerech pro vkládání proměnných do textu zprávy@property– umožňuje zpřístupnit metodu jako atribut pouze pro čtení- podtržítko před názvem metody nebo atributu (
_metoda) značí interní / soukromou část (konvence) my_instance– pokud se přepíše atribut v hlavní třídě, změní se atributy ve všech instancích, které ho samy nepřepisují- rozbalení slovníku (
**) – umožňuje rozbalit obsah jednoho slovníku do jiného, např.:
dict2 = {"c": 3, **dict1}
V modulu models.py je použito rozbalení **result pro rozbalení uložených výsledků.
Agilní vývoj
Na závěr lekce byl stručně zmíněn princip agilního vývoje.
Oproti dřívějšímu přístupu, kdy se vše plánovalo dopředu a koncept se neměnil, se dnes pracuje iterativně:
- práce se rozdělí na menší části
- jednotlivé části se postupně realizují
- průběžně se vyhodnocují výsledky
- ověřuje se, zda se nezměnil požadovaný cíl
- podle potřeby se řešení upravuje