Ideální webový framework pro Python?

Je to už nějaký čas, co se věnuji programování webových aplikací (samozřejmě v Pythonu :). Kdysi jsem začínal s Django ale postupně jsem od něj odcházel, až jsem přešel na Flask. Oba framworky jsou od sebe dost odlišné. Už jen proto, že Django je tzv. „full stack“ framework (obsahuje velké množství funkcí v jednom balíku), kdežto Flask je tzv. „micro framework“ (request, response, url dispatch a šablonovací systém). Ideální ale pro mě není ani jeden. Proč? Na to se pokusím odpovědět v následujícím textu.

Django

Django je výborný framework na aplikace střední a menší velikosti. Mezi jeho největší přednosti patři konzistentní a dobře navržené API, kvalitní dokumentace a množství programátorů, kteří ho používají. To, že se jedná o full stack framework je předností i slabinou. Pro mě bohužel víc to druhé…

Django totiž nabízí (na můj vkus) velice obecné ORM, které je přesně tím důvodem proč mnozí programátoři ORM nechtějí používat. Omezuje nás totiž ve využití maximálního potenciálu konkrétního typu databáze (např. PostgreSQL, Oracle). Z hlediska Djanga je obecný ORM pochopitelný: poskytuje stejné rozhraní všem, což se hodí, pokud programujete např. rozšíření. Často se obecné ORM obhajuje snadnou přenositelností napříč datábázemi. To pokládám za nesmysl: jak často projekt přechází např. z Oracle na PostgreSQL?

Obecné ORM je prostě zlo. Django a Drupal 7 si v tomhle můžou podat ruce…

Ergo, pokud ORM, tak jedině SQLAlchemy. Mnozí z vás určitě namítnou, že můžu dělat alchymii i v Django. Ano, můžu. Ale je to pořád „workaround“, který nemusí být vždy stabilní.

Další zklamání v řadě je integrovaný šablonovací systém. Né že by syntaxe byla špatná, ta je naopak úžasná. Ale Jinja2 je prostě lepší. Je rychlejší, poznáte v ní kdy voláte funkci a kdy přistupujete k proměnné, filtry umožňují více než jeden parametr, atd.

Sečteno a podtrženo, pro projekty, kde Django stačí je Django dobré. Seženete lidi, budete mít přehledný kód a ještě k tomu stihnete i ten deadline. Pokud ale chcete víc, musíte se porozhlédnout dál…

Flask

Flask je tak trochu malý zázrak. Malý proto, že je to mikro framework a zázrak proto, že psaní webových aplikací může být i pro začátečníka přehledné a srozumitelné. Z původního vtípku Armina Ronachera tak vyrostl poměrně dobře použitelný software.

Jeho obrovskou výhodou je, že slouží hlavně jako lepidlo. Programátor si může sám zvolit, která rozšíření potřebuje a použije. V základu má k dispozici jen funkce pro práci s URL (mapování je čitelnější než v Django), HTTP (request, response) a šablonami (jinja2, mimochodem taky od Armina). Flask přitom stojí na HTTP knihovně Werkzeug (taky od stejného autora). Nic víc, nic míň.

Pokud chcete do svého projektu zahrnout podporu databází, je potřeba sáhnout po Flask-SQLAlchemy, pokud potřebujete formuláře, pak můžete využít Flask-WTF, pro autentizaci Flask-Login atp. Zkrátka puzzle.

Celá tahle sranda má ale pár háčků.

  1. Čas od času se stane, že některá rozšíření nespolupracují s těmi, které použiváte (problém u Flask-Babel a Flask-BabelEx).
  2. Rošíření tvoří většinou zase jen lepidlo k původním knihovnám (SQLAlchemy, WTForms).
  3. Každý trochu větší projekt je jiný a hůře se do něj zaučují noví programátoři. V Django je více věci daných předem a proto se pro něj lépe shání pracovní síla.

Přesto se Flask těší čímdál větší oblibě, o které svědčí i rozšiřující se pracovní nabídky (např. Seznam.cz, a.s.). Pro malé a střední projekty s potřebou individuálního řešení se může jednat o skvělý nástroj.

Ideál

Zatím neexistuje.

Ideální framework by měl (ideálně) brát to nejlepší z toho co je, a přidat k tomu něco svého. Určitě by měl být „full stack“, aby se vyhnul desítkám závislostí a vytvořil dobré zázemí pro programátory.

Rámec by měl obsahovat:

  • obsluhu HTTP požadavků a odpovědí
  • kontextové proměnné
  • mapování URL „flaskovským“ stylem + možnost traversal (implementováno například ve frameworku Pyramid)
  • debug režim s debug toolbarem (jako je v Django nebo Flask-DebugToolbar)
  • integrovaný šablonovací systém jinja2
  • formulářové rozhraní, včetně CSRF ochrany
  • silná podpora pro SQLAlchemy (snadné REST API, JSON, CRUD operace)
  • internacionalizace a lokalizace
  • správa session a autentifikace
  • propracovaný systém oprávnění (obzvláště zajímavé možnosti se zde nabízejí ve spojení s traversal URL)
  • servírování statických dat (obrázky, css)
  • podpora pro javascript (komprese výsledného kódu, jQuery jako standardní součást)
  • cachování
  • emaily
  • cron operace
  • administrační rozhraní (volitelné)
  • html komponenty?
  • poctivé možnosti rozšíření

Třeba se časem něco objeví… Nu a kdybyste si opravdu nevěděli rady:

import random
print(random.choice(['Flask', 'Django', 'Pyramid']))
Sdílet na sociálních sítích