Flask vs. Django: kdy zvolit který framework
Flask a Django jsou dva nejrozšířenější Python frameworky pro vývoj backendu. Flask je mikroframework s minimalistickým jádrem, který poskytuje velkou svobodu při návrhu architektury a výběru knihoven. Django je plnohodnotný framework typu „batteries-included“ se silnými konvencemi, integrovaným ORM, autentizací, administrací a šablonovacím systémem. Výběr závisí na požadavcích projektu, velikosti týmu a očekávané životnosti řešení.
Architektonická paradigmata a konvence
- Flask: upřednostňuje explicitní rozhodování – sami si skládáte router, ORM, validační vrstvu, DI i úlohy na pozadí. Hodí se pro lean služby, mikroslužby, prototypy a vysoce přizpůsobené architektury.
- Django: prosazuje „konfiguraci pomocí konvencí“. Struktura aplikace je předem daná (aplikace, modely, pohledy, šablony), což usnadňuje zapracování nových členů týmu i jeho rozšiřování.
Modulární srovnání podle klíčových oblastí
| Oblast | Flask | Django |
|---|---|---|
| Routing | Jednoduchý router založený na dekorátorech; blueprints pro modularitu | Robustní URL dispatcher s namespacy a reverzním routováním |
| ORM a data | Výběr: SQLAlchemy, Pony ORM nebo žádné ORM | Integrované Django ORM, migrace, signály, agregace |
| Administrace | Řešení třetích stran (např. Flask-Admin); více konfigurace | Vestavěná administrační sekce generovaná z modelů |
| Autentizace | Rozšiřitelná (Flask-Login, Flask-Security) | Kompletní procesy autentizace, skupiny, oprávnění, sessions |
| API | Flask-RESTX / Marshmallow / Pydantic podle potřeby | Django REST Framework (DRF) se serializéry a viewsety |
| Asynchronní běh | Možný přes ASGI/Quart nebo hybridním přístupem | Django ASGI (od verze 3.0), nativní pohledy async, Channels |
| Škálování | Vhodný pro mikroslužby; jemnozrnná kompozice | Silný monolit i modulární monorepo; bohatý ekosystém |
Datová vrstva a migrace: SQLAlchemy vs. Django ORM
Ve Flasku je nejčastější volbou SQLAlchemy (Core + ORM). Nabízí expresivní dotazování, relační joins, události a skvělou podporu práce se spouštěči či pohledy; migrace řeší Alembic. Django používá vlastní ORM s deklarativními modely, automatickými migracemi a administračním rozhraním. U komplexních reportů a analytických dotazů se vyplatí kombinovat ORM s raw SQL.
Návrh API: REST, GraphQL a serializace
- REST: ve Flasku se často používají Flask-RESTX/Flask-Smorest; k validaci slouží Marshmallow nebo Pydantic. V Djangu je standardem DRF s viewsety, routery, omezením počtu požadavků, stránkováním a browsable API.
- GraphQL: Flask integruje Graphene či Ariadne; Django nabízí Graphene-Django s mapováním na modely.
- Serializace: Flask – Marshmallow/Pydantic; Django – DRF Serializers, ModelSerializers.
Asynchronní zpracování, WebSockety a komunikace v reálném čase
Pro dlouhotrvající úlohy použijte Celery (broker RabbitMQ/Redis). Komunikace v reálném čase:
- Flask: Flask-SocketIO (přes WS/long-polling); pro čisté ASGI zvažte interoperabilitu s Quart/Starlette.
- Django: Django Channels pro WebSockety, skupiny a stav přítomnosti; přirozeně se integruje se servery ASGI.
Bezpečnostní standardy pro produkční backend
- HTTPS a HSTS, správně nastavené cookies Secure/HttpOnly a zásady SameSite.
- Ochrana CSRF (ve Flasku pomocí rozšíření, v Djangu vestavěná).
- Omezení počtu požadavků a ochrana proti útokům hrubou silou (Flask-Limiter, DRF throttling).
- Správa tajných údajů: prostředí (.env, Vault), rotace klíčů, žádná tajemství v repozitáři.
- Validace vstupů a sanitizace; kontrakty definované pomocí schémat (OpenAPI/JSON Schema).
Konfigurace, prostředí a zásady 12-factor
- Oddělení konfigurace od kódu, hierarchie settings pro dev/stage/prod.
- Neměnné sestavení, nasazování s prioritou kontejnerů (container-first), procesy bez udržování stavu (stateless).
- Standardizované logování (JSON), korelace požadavků, metriky a trasování.
Testování a kvalita: jednotkové, integrační a end-to-end testy
- Jednotkové testy: pytest, izolace obchodní logiky, simulace externích služeb.
- Integrační testy: testovací klient Flask/Django, databáze v paměti nebo kontejnerizovaný Postgres.
- E2E: Playwright/Cypress pro API/UI vrstvu, smluvní testy s OpenAPI.
- Kontinuální integrace s coverage gates, statická analýza (ruff, mypy), hooky pre-commit.
Šablonování, vykreslování na straně serveru a headless přístup
Flask používá Jinja2, Django má vlastní šablonovací engine. U headless architektur zpřístupněte čisté JSON/GraphQL API a frontend řešte samostatně (React/Vue/Svelte). U projektů s důrazem na SEO lze kombinovat SSR a API (šablony Django/HTMX, Flask+Jinja + progresivní vylepšování).
Statická média a soubory
- Flask: statické soubory obsluhujte přes reverzní proxy (NGINX), používejte verzování a CDN; nahrávání řešte pomocí rozšíření (Flask-Uploads) nebo vlastní logikou.
- Django: collectstatic, storage backends (S3, GCS), nastavení podle prostředí a podepsané URL.
Vrstvy aplikace a doporučená architektura
- Prezentační vrstva: pohledy/blueprints, DRF viewsety, serializéry.
- Doména: servisní vrstva (případy užití), čistá obchodní logika bez závislostí na frameworku.
- Data: návrhový vzor repository nad ORM, transakční hranice, jednotky práce.
- Integrace: klienti externích služeb (HTTP, gRPC, message bus), definované ports/adapters.
Výkon: latence, propustnost a optimalizace dotazů
- Profilování (py-spy, cProfile), APM (OpenTelemetry + backend).
- Ukládání do mezipaměti: aplikační (Flask-Caching, Django cache framework), datové (Redis), HTTP (ETag/Cache-Control).
- Optimalizace dotazů: select_related/prefetch_related v Djangu, joinedload/subqueryload v SQLAlchemy.
- Asynchronní I/O pro operace, při nichž se čeká (síť, FS), dávkové zpracování a operace bulk.
Autentizace a autorizace
- Založená na session: jednoduchá volba pro tradiční weby; ochrana CSRF je nezbytná.
- Založená na tokenech: JWT, OAuth 2.0, OIDC; integrace s poskytovateli identity.
- Role a oprávnění: Django má vestavěné Permissions/Groups; ve Flasku lze využít knihovny jako Flask-Principal nebo vlastní vrstvu zásad.
Tvorba administračního rozhraní a back-office
Django admin urychluje CRUD operace nad daty a je ideální pro interní nástroje či správu katalogů. Ve Flasku lze kombinovat Flask-Admin/Flask-AppBuilder, případně vytvořit administrační rozhraní jako samostatnou SPA nad API. Klíčové jsou auditování akcí, podrobné nastavení oprávnění a exporty (CSV/Excel).
Observabilita: logy, metriky a trasování
- Strukturované logy s korelačním request-id a uživatelským kontextem.
- Metriky (klient Prometheus), SLA/SLO a upozorňování na chybovost, latenci a saturaci.
- Distribuované trasování (OpenTelemetry) pro sledování volání mezi službami.
Nasazení: servery WSGI/ASGI, kontejnery a CI/CD
- Servery: Gunicorn/Uvicorn/Hypercorn; NGINX/Envoy jako reverzní proxy.
- Kontejnery: vícefázová sestavení, minimální základní obrazy (alpine/ubi-micro), běhové prostředí distroless.
- CI/CD: testy, bezpečnostní skeny, migrace před spuštěním, kontroly stavu a postupné nasazování (blue-green/canary).
Monolit, modulární monolit, nebo mikroslužby?
Django tradičně vyniká v monolitech a modulárních monolitech s jasně vymezenými hranicemi aplikací. Flask je přirozenou volbou pro mikroslužby. Rozhodnutí by mělo vycházet z team topology, nezávislosti domén, rychlosti nasazování a požadavků na režii koordinace (smluvní testy, verzování API, observabilita mezi službami).
Práce s dlouhotrvajícími úlohami a plánováním
- Celery pro asynchronní fronty (ETL, notifikace, tvorba miniatur), plánování pomocí beat nebo externích orchestrátorů.
- Vzor Transactional outbox pro spolehlivé publikování událostí (Kafka, RabbitMQ).
Doménově řízený návrh v backendech Pythonu
Bez ohledu na framework zvažte principy DDD: agregáty, entity, objekty hodnot a doménové události. Izolujte doménu od frameworku, aby byla testovatelná a přenositelná. Framework pak slouží především jako adapter pro web, data a integrace.
Mezivýsledky a PoC: jak efektivně začít
- Pokud je doména nejasná, začněte ve Flasku s PoC a minimem závislostí.
- U produktu s jasně vymezenou doménou a potřebou back-office začněte s Djangem, DRF a administračním rozhraním.
- V obou případech definujte kontrakty OpenAPI a datové modely dříve, než začne přibývat závislostí.
Časté chyby a jak se jim vyhnout
- „Prosakující“ doména navázaná na ORM – oddělte servisní vrstvu a validaci.
- Nedostatečná observabilita – bez metrik a trasování neodhalíte zhoršení výkonu.
- Neřešené migrace a kvalita dat – CI pipeline by měla zahrnovat testy migrací.
- Přehnané využívání asynchronního zpracování – async použijte jen tam, kde zkrátí čekání, nikoli pro logiku vázanou na CPU.
Doporučené základní stacky
- Základní stack Flask: Flask + SQLAlchemy + Alembic + Marshmallow/Pydantic + Flask-Login + Celery + klient Prometheus + OpenTelemetry.
- Základní stack Django: Django + Django ORM + Migrations + DRF + Django Auth + Channels (podle potřeby) + Celery + cache framework + OpenTelemetry.
Shrnutí a doporučení
Flask nabízí lehkost a jemnou kontrolu a je ideální pro mikroslužby a vysoce specializované backendy. Django přináší rychlý start, jednotnou architekturu a bohatou výbavu pro podnikové aplikace. Pro datové a produktové týmy je pragmatické zvážit hybridní ekosystém: monolit či modulární monolit v Djangu pro hlavní doménu a satelitní služby Flask pro specializované úlohy. Klíčem k udržitelnému vývoji jsou jasné kontrakty (OpenAPI), kvalitní testování, observabilita a zásady 12-factor – bez ohledu na zvolený framework.
