HTTP to podstawowy protokół komunikacji między frontendem a backendem Pytigon. Każda interakcja użytkownika — załadowanie tabeli, przesłanie formularza, kliknięcie przycisku — przepływa przez żądania i odpowiedzi HTTP, niezależnie od tego, czy klientem jest przeglądarka internetowa, desktopowa aplikacja wxPython czy urządzenie mobilne.
Każdy URL widoku Pytigon służy jednocześnie dwóm celom:
Strona HTML — przy normalnym dostępie (GET z Accept: text/html) widok zwraca w pełni wyrenderowaną stronę HTML z układem Bootstrap, nawigacją i treścią.
Endpoint API — przy dostępie z ?format=json lub Accept: application/json, ten sam URL zwraca ustrukturyzowane dane JSON — idealne dla wywołań AJAX z frontendowej biblioteki JavaScript.
Oznacza to, że nigdy nie potrzebujesz oddzielnych URL-i „strony” i „API”. Jeden URL. Dwie reprezentacje. Zero duplikacji.
Typowa interakcja HTTP podąża za tym wzorcem:
[Przeglądarka/Klient]
│
│ GET /tables_demo/table/Album/list/
│ ├─ Cookies: sessionid=abc123
│ └─ Accept: text/html
│
▼
[Pytigon View]
│
│ 1. Uwierzytelnianie (middleware sesji Django)
│ 2. Sprawdzenie uprawnień (uprawnienia widoku)
│ 3. Budowanie QuerySet (model queryset + filtry)
│ 4. Przygotowanie kontekstu (zmienne szablonu)
│ 5. Renderowanie szablonu (.ihtml → .html → odpowiedź)
│
▼
[Klient otrzymuje stronę HTML]
│
│ AJAX: GET /tables_demo/table/Album/list/?format=json&offset=0&sort=name
│ (komponent tabeli JavaScript żąda danych)
│
▼
[Pytigon View]
│
│ Ten sam widok, ale:
│ ├─ Wykrywa format=json
│ └─ Zwraca tablicę JSON z wierszami tabeli
│
▼
[Klient renderuje wiersze tabeli przez JavaScript]
Komponent tabeli frontendu używa progresywnego ładowania:
Początkowe ładowanie strony → szkielet HTML z pustym placeholderem tabeli
→ JavaScript wyzwala żądanie AJAX o pierwszą stronę danych
→ Serwer zwraca dane wierszy w JSON
→ JavaScript renderuje wiersze do tabeli
→ Użytkownik przewija → kolejna strona ładowana przez AJAX
Zapewnia to: - Szybkie początkowe ładowanie strony (szkielet renderuje się natychmiast) - Doświadczenie nieskończonego przewijania - Sortowanie i filtrowanie po stronie serwera - Minimalny transfer danych (tylko widoczne wiersze)
Formularze podążają za dwoma wzorcami:
POST /tables_demo/table/Album/1/edit/
Content-Type: application/x-www-form-urlencoded
name=New+Name&artist=New+Artist...
→ Serwer waliduje, zapisuje, przekierowuje do widoku listy
POST /tables_demo/table/Album/1/edit/
Content-Type: application/json
X-Requested-With: XMLHttpRequest
{"name": "New Name", "artist": "New Artist"}
→ Serwer waliduje, zapisuje
→ Zwraca JSON: {"success": true, "redirect": "/...", "errors": null}
Frontendowa biblioteka JavaScript wykrywa nagłówek X-Requested-With w odpowiedzi i odpowiednio ją obsługuje — pokazując błędy walidacji w linii lub przekierowując w razie sukcesu.
Niestandardowe akcje (eksport, operacje wsadowe, przejścia workflow) używają żądań POST do URL-i akcji:
POST /tables_demo/table/Album/action/export_pdf/
Content-Type: application/json
{"selected_ids": [1, 2, 3], "format": "pdf"}
→ Serwer przetwarza akcję
→ Zwraca JSON lub wyzwala pobranie pliku
Odpowiedzi błędów HTTP podążają za spójnym wzorcem:
{
"error": true,
"message": "Permission denied",
"code": 403,
"details": "You do not have permission to edit this record."
}
Frontendowa biblioteka JavaScript przechwytuje je i wyświetla odpowiednie komunikaty dla użytkownika — modalne okna dialogowe dla błędów blokujących, powiadomienia typu toast dla błędów informacyjnych.