Přeskočit obsah

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í hodnota False)

Třída obsahuje asynchronní metody:

  • send
  • close_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_answer
  • as_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