Flask vs. Django: kdy který framework zvolit
Flask a Django jsou dvě nejrozšířenější platformy pro vývoj backendu v jazyce Python. Flask je mikroframework s minimalistickým jádrem, který poskytuje velkou volnost v architektuře a výběru knihoven. Django je plnohodnotný framework typu „batteries-included“ se silnou konvencí, integrovaným ORM, autentizací, administrací a šablonováním. Volba závisí na požadavcích projektu, velikosti týmu a očekávané životnosti řešení.
Architektonické paradigmy a konvence
- Flask: preferuje explicitní rozhodování – vy sami sestavujete router, ORM, validační vrstvu, DI i úlohy na pozadí. Vhodné pro lean služby, mikroslužby, prototypy a vysoce přizpůsobené architektury.
- Django: prosazuje „konfiguraci skrze konvence“. Struktura aplikace je předem daná (aplikace, modely, pohledy, šablony), což usnadňuje nástup nových členů týmu a škálování projektu.
Modulární srovnání podle klíčových oblastí
| Oblast | Flask | Django |
|---|---|---|
| Routing | Jednoduchý dekorátorový router; blueprints pro modulárnost | Robustní URL dispatcher s namespacy a reverzním routováním |
| ORM a data | Volba: SQLAlchemy, Pony ORM nebo bez ORM | Integrované Django ORM, migrace, signály, agregace |
| Admin | Třetí strany (např. Flask-Admin); více konfigurace | Vestavěná admin sekce generovaná z modelů |
| Autentizace | Rozšiřitelná (Flask-Login, Flask-Security) | Plné auth pipelines, skupiny, oprávnění, sessions |
| API | Flask-RESTX / Marshmallow / Pydantic dle volby | Django REST Framework (DRF) se serializéry, viewsety |
| Asynchronní běh | Možné přes ASGI/Quart nebo hybridní přístup | Django ASGI (od verze 3.0+), nativní async views, Channels |
| Škálování | Dobré 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, eventy a vynikající podporu pro triggery či pohledy; migrace zajišťuje Alembic. Django využívá vlastní ORM s deklarativními modely, automatickými migracemi a integrovaným admin rozhraním. Pro složitější reporty a analytické dotazy je vhodné kombinovat ORM s přímými SQL dotazy (raw SQL).
API návrh: REST, GraphQL a serializace
- REST: ve Flasku se často používají Flask-RESTX nebo Flask-Smorest; validace pomocí Marshmallow či Pydantic. V Djangu je standardem DRF s viewsety, routery, omezením přístupů (throttlingem), stránkováním a browsable API.
- GraphQL: Flask integruje Graphene nebo Ariadne; Django nabízí Graphene-Django s mapováním na modely.
- Serializace: Flask – Marshmallow/Pydantic; Django – DRF Serializéry, ModelSerializéry.
Asynchronní zpracování, WebSockety a realtime
Pro dlouhotrvající úlohy doporučujeme použít Celery s brokery jako RabbitMQ nebo Redis. Realtime komunikace:
- Flask: Flask-SocketIO (WebSockety/long-polling); pro čisté ASGI řešení lze zvážit Quart nebo Starlette.
- Django: Django Channels pro WebSockety, skupiny a přítomnost uživatelů; přirozená integrace s ASGI servery.
Bezpečnostní standardy pro produkční backend
- HTTPS a HSTS, správné nastavení Secure/HttpOnly cookies, politika SameSite.
- CSRF ochrana (rozšíření ve Flasku, vestavěná v Djangu).
- Rate limiting a ochrana proti brute-force útokům (Flask-Limiter, DRF throttling).
- Správa tajemství: prostředí (.env, Vault), rotace klíčů, žádná tajemství v repozitáři.
- Validace a sanitace vstupů; schéma řízené kontrakty (OpenAPI/JSON Schema).
Konfigurace, prostředí a 12-factor discipliny
- Oddělení konfigurace od kódu, hierarchie settings pro dev/stage/prod prostředí.
- Neměnné buildy, container-first nasazování, stateless procesy.
- Standardizované logování (JSON), korelace požadavků, metriky a tracing.
Testování a kvalita: jednotkové, integrační a end-to-end
- Jednotkové testy: pytest, izolace byznys logiky, mocking externích služeb.
- Integrační testy: testovací klient ve Flasku/Djangu, in-memory databáze nebo kontejnery s Postgresem.
- End-to-end (E2E): Playwright/Cypress na úrovni API/UI, smluvní testy s OpenAPI.
- Kontinuální integrace s coverage gates, statická analýza (ruff, mypy), pre-commit hooky.
Šablonování, server-side rendering a headless přístup
Flask používá Jinja2, Django disponuje vlastním šablonovacím enginem. Pro headless architektury exportujte čisté JSON/GraphQL API a frontend řešte separátně pomocí Reactu, Vue nebo Svelte. U projektů s důrazem na SEO lze kombinovat SSR a API (Django templates/HTMX, Flask + Jinja + progressive enhancement).
Statická média a soubory
- Flask: obsluha statických souborů přes reverzní proxy (NGINX), verzování a CDN; upload souborů přes rozšíření (Flask-Uploads) nebo vlastní logiku.
- Django: collectstatic, storage backends (S3, GCS), nastavení dle prostředí a podepisování URL.
Vrstvy aplikace a doporučená architektura
- Prezentace: views/blueprints, DRF viewsety, serializéry.
- Doména: službová vrstva (use-cases), čistá byznys logika bez závislosti na frameworku.
- Data: repository pattern nad ORM, transakční hranice, jednotky práce.
- Integrace: klienti na externí služby (HTTP, gRPC, message bus), definované ports/adapters.
Výkon: latence, propustnost a optimalizace dotazů
- Profilování (py-spy, cProfile), APM (OpenTelemetry + backend).
- Cacheování: 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 čekání (síť, FS), dávkové a bulk operace.
Autentizace a autorizace
- Session-based: jednoduché řešení pro tradiční weby; vyžaduje CSRF ochranu.
- Token-based: JWT, OAuth 2.0, OIDC; integrace s identity providery.
- Role a práva: v Djangu vestavěné Permissions/Groups; ve Flasku knihovny jako Flask-Principal nebo vlastní vrstva politik.
Tvorba admin rozhraní a backoffice
Django admin výrazně urychluje CRUD operace nad daty a je ideální pro interní nástroje či správu katalogů. Ve Flasku je možné kombinovat Flask-Admin/Flask-AppBuilder nebo postavit admin jako samostatnou SPA nad API. Klíčové jsou auditování akcí, granularita oprávnění a export dat (CSV/Excel).
Observabilita: logy, metriky a tracing
- Strukturované logy s korelačním request-id a uživatelským kontextem.
- Metriky (prometheus klient), SLA/SLO a alerting na chybovost, latenci a saturaci.
- Distribuovaný tracing (OpenTelemetry) pro sledování volání mezi službami.
Nasazení: WSGI/ASGI servery, kontejnery a CI/CD
- Servery: Gunicorn/Uvicorn/Hypercorn; NGINX/Envoy jako reverzní proxy.
- Kontejnery: vícefázové buildy, minimální základní obrazy (alpine/ubi-micro), distroless runtime.
- CI/CD: testy, bezpečnostní kontroly, migrace před spuštěním, healthchecks a postupné nasazení (blue-green/canary).
Monolit, modulární monolit nebo mikroslužby?
Django tradičně vyniká v monolitických i modulárních monolitických aplikacích s jasně hranicemi aplikací. Flask je přirozeným kandidátem pro mikroslužby. Rozhodnutí by mělo vycházet z team topology, nezávislosti domén, rychlosti nasazení a požadavků na koordinační overhead (smluvní testy, verzování API, observabilita mezi službami).
Práce s dlouhý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ů.
- Transactional outbox vzor pro spolehlivé publikování událostí (Kafka, RabbitMQ).
Doménově řízený návrh v Python backendech
Bez ohledu na použitý framework zvažte principy DDD: agregáty, entity, value objekty, doménové události. Izolujte doménovou logiku od frameworku tak, 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
- U nejasné domény začněte ve Flasku s PoC s minimem závislostí.
- Pro produkt s definovanou doménou a potřebou backoffice startujte v Djangu s DRF a admin rozhraním.
- V obou případech definujte OpenAPI kontrakty a datové modely ještě před tím, než narostou závislosti.
Časté chyby a jak se jim vyhnout
- „Leaky“ doména spojená s ORM – oddělte službovou vrstvu a validaci.
- Nedostatečná observabilita – bez metrik a sledování tras neodhalíte regresi výkonu.
- Neřešené migrace a datová kvalita – CI pipeline by měla zahrnovat testy migrací.
- Přehnaná asynchronní implementace – async používejte jen tam, kde zkrátí čekání, nikoli pro CPU bound logiku.
Doporučené „baseline“ stacky
- Flask baseline: Flask + SQLAlchemy + Alembic + Marshmallow/Pydantic + Flask-Login + Celery + Prometheus klient + OpenTelemetry.
- Django baseline: Django + Django ORM + migrace + DRF + Django Auth + Channels (dle potřeby) + Celery + cache framework + OpenTelemetry.
Souhrn a doporučení
Flask nabízí lehkost, 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é uvažovat o hybridním ekosystému: monolit nebo modulární monolit v Djangu pro jádro domény a satelitní Flask služby pro specializované úlohy. Klíčem k udržitelnému vývoji jsou jasné kontrakty (OpenAPI), kvalitní testování, observabilita a disciplíny 12-factor – bez ohledu na vybraný framework.