Python: nahradím PHP Flaskem?

Pokud chcete rychle znát odpověď, tak ne. Částečně mi PHP nahradí, ale jen v případech, kdy je k dispozici server (VPS, dedikovaný server) a není výhodné stavět na WordPressu.

Soubor technologií, které potřebuji, se mi rozrostl o pythonovský mikroframework Flask. Vybíral jsem z několika „konkurenčních“ řešení, mezi nimiž nechyběl Bottle, CherryPy, ani velmi známé Django. Django je komplexní, pro mě často na úrovni „kanónu na vrabce“, ale proč ne, když někdo takovou funkčnost potřebuje a využije. CherryPy mi připadalo trochu chaotické ve způsobu zavedení routování a práci se statickými soubory/adresáři.

Reklama

Programovací jazyk Python není běžně první volbou při vývoji webových aplikací, pro klasické PHP se vyzdvihují především široká základna vývojářů, velmi dostupné webhostingy a v neposlední řadě naprosto triviální deployment. Řešit cenu za webhosting je irelevantní; pořízení virtuálního serveru vyjde dnes na stejné peníze, jako pořízení sdíleného hostingu s PHP; tj. od 1 € měsíčně. Trochu větší popularitě, než Python, se těší Ruby (respektive RoR), JavaScript (node.js), nebo Java. Mě osobně nejvíce vyhovují Python a Go.

Objektivně vzato je Python výborná volba, pro terminálový script, pro desktopovou aplikaci (v obou případech PHP dost selhává), nebo třeba webovou aplikaci. Nevyvezl se na módní vlně, jako Ruby, ale považuji jej za „top jazyk“. Nemalou zásluhu na použitelnosti Pythonu má rozsáhlý ekosystém knihoven, který pokrývá snad všechny možné potřeby.

Jak jsem předestřel, Python je pro mě většinou jazyk první volby, pokud jsem ochoten dát správci do rukou zdrojové kódy. Avšak pokud je má k dispozici zvědavec i experimentátor v jedné osobě, který bude chtít něco vyzkoušet a způsobí hledání nefunkčnosti, děkuji ale volím Go, nebo „kompilovaný“ Python (přes PyInstaller).

Webový framework ušetří programátorovi hodně práce, například s routingem („hezká URL“), nebo zpracováním http/https komunikace.

Kdybych neměl co dělat, tak vývoj vlastního základního frameworku je realizovatelný, což je pěkné pro pochopení, ale v praxi není čas na znovuvynalézání kola.

K volbě Flasku mě přivedlo vyhledání porovnání výkonu (např. od Kirilla Klenova), ve kterém si Flask vedl průměrně. Jasná specifikace toho, že chci modulární framework (Django je All-in-One). Dalším měřítkem byla i popularita. S popularitou souvisí samozřejmě i to, jak snadno se mi bude hledat nápověda, když si nevím rady. Kombinací těchto parametrů mi vyšel Flask jako nejlepší volba, ale někomu jinému může vyhohovat třeba TurboGears, nebo web2py.

Protože jsem trochu „stará škola“, vyhýbám se například SQLAlchemy, mám rád plnou kontrolu nad databází, ale Flask má rozšíření i pro tuto univerzální knihovnu.

Webovou aplikaci ve Flasku lze spouštět přes WSGI, ale i jako službu naslouchající na některém portu bez serveru, pokud je takových více využije se Nginx, či Apache, jako reverzní proxy. Nepotřeba „tlustého serveru“ se mi zdá výhodná, pokud by se jednalo o webové rozhraní běžící třeba na zabudovaném Raspberry-Pi (nebo podobné miniaturce), kde se člověk snaží ušetřit každé promile systémových prostředků.

Proč mi Flask nenahradí PHP?

Programování v PHP se věnuji už dlouhou dobu, první verze se kterou jsem se setkal bylo PHP 3.0 a přiznám se, že svoje zdrojové kódy z té doby bych dnes nechtěl zpětně studovat.

V PHP je napsán třeba WordPress, který je tím nejrozšířenějším CMS a pro vystavění obsahového webu (kam počítám i firemní stránky) je to ideální volba. Baví mě i když spíše na úrovni vývoje specifických rozšíření pro zákazníky.

PHP snad ještě stále je i základním jazykem ve Facebooku, byť mají vlastní interpretr.

Obejít se bez dobré znalosti PHP, pro programátora webového backendu, je téměř nemožné. Podle mě není jazyk úplně špatně navržený, bohužel je počátek křivky učení velmi tak strmý, že amatér v něm zbastlí výtvor po několika hodinách samostudia, bez pochopení bezpečnosti, práce s daty, MVC, …

Minimálně WordPress je pro mě důvod, proč ve své hlavě nezahodím PHP a ještě dlouho budu sledovat a studovat jeho trendy i vývoj.

Místo závěru

Python je jednoduchý, neváhám jej propagovat jako první jazyk pro výuku programování. Ale vedle své jednoduchosti je i velmi mocný, když se použíjí správné knihovny. Komunita je živá, nabídka knihoven velmi široká a není divu, že Python je osvědčený jazyk pro malé scripty, ale i vědecké výpočty, či programování pro internet věcí (MicroPython).

Python používám na svých projektech několik let, pokud není rychlost běhu programu kritickým měřítkem. Tam kde je rychlost běhu kritická, nastupují kompilované programy. Ať jde o starší projekty v Pascalu, nebo Go (od roku 2016).

Flask mi dává do rukou mocný nástroj pro tworbu webových aplikací. Je výkoný, nemá zbytečné komplikace a pokud je to nutné, lze projekt „zkompilovat“ (nedovolit experimenty na produkčním nasazení).

Užitečné odkazy

  • Domovská stránka projektu Flask.
  • Flask v příkladech se mi zdá jako výborný začátek, pochybuji že do Flasku se pustí někdo bez znalostí Pythonu a programování obecně.
  • Awesome Flask rozcestník na pluginy, tutoriály, …
  • Knihovna flask-http2-push pro podporu HTTP/2, kterýžto protokol není standarně podporován (není ani běžným standardem v ostatních frameworcích).

Komentáře

12 komentářů: „Python: nahradím PHP Flaskem?“

  1. Miroslav Koula avatar

    Já jsem k podobnému dospěl někdy okolo roku 2009, kdy jsem potřeboval napsat backendové skripty běžící v cronu a synchronizují DB, stahují fotky atp.
    PHP v té době trpělo bugem uvolňujícím paměť při iteracích a já bohužel potřeboval iterovat miliony, desítky milionů, šlo to sice obejít různým rozdělením do chunků, message queues v té době v podstatě ještě nebyli a s pythonem už jsem nějakou dobu koketoval a tak jsem si zkusil napsat skriptík, který tahá data přes XML-RPC a byl jsem překvapen, že paměťově to bylo oproti PHP absolutně nenáročné a ve finále i zpracování bylo znatelně rychlejší.
    Od té doby jsem tedy, pokud to projekt dovolil, psal různé backend skripty v pythonu. Ve 2.x byl trochu boj s unicode, ve 3.x verzi zase s knihovnami co nebyli portované do trojkové verze z dvojkové, ale víceméně už se to nějak ustálilo…
    K Flasku jsem se zatím nedostal, ale mám v plánu se podívat na řešení microservices přes Flask.
    S Djangem jsem si hrál delší dobu, zejména v době boomu ORM, ale ani django ORM mě dlouhou dobu vadilo a používat django bez jeho object-orm modelu mi přišlo zase trošku hloupé, takže jsem tehdy zůstal u PHP a víceméně jsem u něj dodnes a proto čistý web -> PHP, backend, bi, a možná microservices -> python.

    1. Marek Olšavský avatar

      Díky za komentář.

      Já jsem dlouho spokojeně dělal v PHP, webové programování není moje hlavní činnost. Třeba WordPress mi opravdu sedl a tím jak je oblíbený, tak se vyskytují potřeby napsat plugin, který je prostě specifický pro jednoho zákazníka, dělat šablonu je pro mě utrpení, nedejbože kdybych měl vymyslet, jak to má vypadat :-).

      S Pythonem pár let dělám, myslím si, že nějaké znalosti jsem už nabral. Moje oblíbená kombinace je s PostgreSQL „za zády“. Protože ne každý webový ovládací panel je obsahový web, hledal jsem cestu, jak použít na serverovou část Python. Asi 14 dní jsem se zlobil s CherryPy, než jsem objevil Flask. V té době nebylo úplně na pořadu dne přepsání control panelu z PHP do Python/Flask a pak už jsem kolegu nepřesvědčil, že by krabičkám odlehčil od obrovského Apache. Ale další projekt, který nebude obsahový, plánuji na Flask, byť vím, že to bude na začátku peklo, protože jej nemám úplně pod kůží, udělal jsem si jen pár experimentálních pidiprojektů (Raspberry Pi mi tu chvílemi podlouchalo asi na 40 portech s různými experimenty).

      Pro microservices bych Flask nevolil. Použil bych jen Pythonovskou část pro komunikaci na portu a daemonizaci programu. Ale zase je to o preferencích.

  2. Ondřej Tůma avatar

    Rád bych přidal taky trochu info možná z jiného úhlu. Neber to prosím jako kritiku, snad doplnění, nebo opravdu jiný pohled na věc.

    * To že je PHP na většině webových serverů, je způsobeno zejména proto, že PHP je primárně určen právě pro tvorbu webu.
    * Oblíbenost Pythonu je diskutabilní, v našem regionu je na tom lépe PHP, ale např. ruby je dle mého názoru na tom mnohem hůř než Python, tvrdá data nemám, někde teď vyšel výsledek výzkumu, kde na tom byl nejlépe Python. Záleží asi jak na co.
    * Python má díky své rozšiřitelnosti na svém stroji většina linuxáků, ani o tom neví. To proto, že v něm jsou běžně psané GUI aplikace, např. pro Gnome.
    * Flask rozhodně není micro-frameworkem, tím je web2py, můj PoorWSGI, nebo bottle. Flask umí řešit spoustu věcí, které možná ani nemají být potřeba, např. právě HTTP vrstvu.
    * Python je kompilovaný jazyk, a ve většině případů (standardně) pouštěn právě z pyc nebo pyo souborů, záleží na stupni optimalizace. A běh ze zdrojových souborů, většinou znamená nejprve kompilaci do pyc souborů. Je to stejné jako u Javy.
    * Znovu-objevováním objeveného kola možná každý nevytvoří průkopnickou knihovnu, o jazyku se ale autor doví víc, než když bude používat knihovny a frameworky o úroveň výš 🙂

    Nejvíce mi ale vadí to spojení PHP vs Flask. Je to srovnání zcela mimo. Flask je framework pro snazší tvorbu webových (wsgi) aplikací. PHP je jen jazyk a ten má být srovnán s Pythonem. Pak můžeme mluvit o porovnání PHP a Pythonu na web, protože to je jen jedno možná velmi malé odvětví, kde se Python nasazuje.

    PHP znám, tedy znal jsem a narazil sam na mnohé jeho limity. A vůbec mě nevadí, že sem jej přestal používat. Python má mnohé limity také, některé se snaží tvůrci řešit, jiné asi řešit nikdy nebudou. Pokud o nich ale programátor ví, nemusí mu ani vadit.

    1. Miroslav Koula avatar

      Souhlas PHP vs Flask, spíše je to PHP vs Python, ale já se nad tím nějak moc nezamýšlel, neb v obou dvou jazycích je použití bez „knihoven“ nebo „frameworků“ v praxi složité…

      Ale ono se to hůře porovnává, i v PHP ať už zvolíme Nette, Symfony, Laravel, Zend, Yii, Phalcon dostaneme se na to co umí víceméně Flask a Django. Základní logika je asi všude stejná a pak se to liší šíří nějakých dodatečných knihoven pod frameworkem…

      Na Ruby běží Railsy, asi je i něco jiného, ale vzhledem, že v tom nedělám, tak ani nevím co přesně.

      Není to jen ČR, moje zkušnosti z posledních 5 let v Německu jsou ty, že PHP pozice hledá každý a o Python a Rails ještě před 2-3 lety člověk občas narazil, ale v současnosti mi přijde, že je vzácné a spíše na ústupu, spíše se dere ven Javascript na Node a pak i AngularJS a React…

      Hodně je to šíří právě základy a jednoduchostí. Od té doby co vzniklo x implementací LAMPu na jeden klik v tom je schopný za hodinu na jakémkoli systému dělat každý, ale s Pythonem a Ruby to je jiné. Sice jsou často ve většině distribucích linuxů i os x, ale rozběhnout si webové prostředí s nějakým hello world už vyžaduje krapet více zručnosti…

      Zajímavé je, že jak Seznam, tak Google kromě Javy hodně používají právě i hojně Python a myslím si, že právě díky rychlosti zpracování a jednoduššímu vývoji oproti Javě…

      No a většina firem co jsem poznal a mají nějaké BI lidi, tak ti většinou dělají v Pythonu 🙂

      1. Marek Olšavský avatar

        Google se asi chce Pythonu zbavit. Proto investovali do jazyka Go :-). Už nejspíše narazili na limity. Tak trochu mám pocit, že utlumují i Dart. Někdy to vypadá, že Google dává open source světu technologie, které vytvořil a neví si s nimi rady dál, či je už nepotřebuje, kdežto Facebook opensourcuje celý svůj sw, který používá. Go bude asi dost dobrou výjimkou (v Google).

        Node.js vypadá zajímavě. Nejsem nějak nastaven na hype vlny, takže pokud jej nepotká za pár let osud Ruby/RoR, bude důvod se na něj kouknout. Teď asi vypadám jako škarohlíd :-D.

        To že není snadné se dostat k „Hello world“, nebo základnímu CRUD bych hodnotil spíš kladně :-). Asi neznám zákazníka, který by chtěl aby se mu ve webu/aplikaci vrtal člověk po „naučte se programovat [web] za 25 minut.“ (Tfuj já jsem ošklivej, taky jsem kdysi (1986) nějak absolvoval první programátorské krůčky.)

    2. Marek Olšavský avatar

      Díky za komentář.

      Vidíš to, skoro všude jsem narazil na zařazení mikroframework, ale neřešil jsem to dál :-), takže nehodlám rozporovat ani jednu verzi. Dělání vlastního fw naučí, pokud má člověk dost času, tak využije schopností jazyka, ale pokud ten čas na začátku není, je to „plat prtné“.

      Jsem z Linuxářů, kteří vědí a píší si v něm i nějaké desktopovky, pokud potřebuji relativně rychle produkční verzi (používám tkinter, protože se mi snadno a rychle distribuuje i ve světě Windows, ostatní GUI žádný pohodlný zázrak). Jak to myslím s kompilací se mi asi nepovedlo napsat úplně ideálně. Flask (ale i další perzistentně běžící programy) prostě jedou z pyo/pyc vzniklých při startu, žádná rychlostní penalizace při spuštění, ale pořád leží na serveru „lákadlo“ pro zvědavce, po kompilaci si do toho nešáhne. Ono ani PHP se tupě neinterpretuje, ale od PHP4 se na pozadí kompiluje do bytecode, i proto se syntaktická chyba neobjeví někde uprostřed stránky.

      Python jsem se učil mít rád postupně, dokonce jsem kdysi váhal, jestli nebude smysluplnější se učit Perl, nebo tehdy hypované Ruby (to se mi ale fakt nelíbilo). Nevadí mi svázanost Flasku s Jinja2 (možná jdou použít i jiné šablonovací systémy, neměl jsem potřebu zkoušet, protože mi J2 sedlo), dokonce jsem odkojený PHP Smarty, tak ani neumím prasit práci s daty a jejich vizualizaci dohromady (tohle je za mě hodně brutální slabina PHP, že to defaultně jde).

      Ještě narážím na hlášky ve stylu „vykašli se na PHP, Node.js a RoR jsou lepší“, tak jsem tipnul bez nějakého zkoumání tvrdých dat. Častěji, než na zmínku o Pythonu (je mi lhostejno  kterým frameworkem).

      Vyhovuje mi třeba i snadný přístup k sériovým portům z Pythonu, nebo chování Psycopg2 vůči PDO (hodně času a nervů mě stálo, než jsem přišel na to, že Boolean, či pole je nutné zpracovat nějakou obezličkou, protože PDO je obecné a prostě snadno neumožní využít specifické schopnosti dtb). Pravda, nezkoumal jsem třeba jestli existuje nějaký PHP ekvivalent pro NumPy/SciPy, ale v Pythonu jsem jimi data zpracoval opět velmi snadno.

      Za mě hodně plusů pro logičtější Python, ale jak jsem napsal „PHP se nezřeknu“. Je to většina zákazníků, co potřebuje PHP, protože nechtějí řešit vlastní server a systémáka, nebo nemají specifika, která jsou pro PHP za limitem možností.

      1. Ondřej Tůma avatar

        Je to přesně tak jak píšeš. PHP lepiče kódu najdeš na každé zastávce. Těch dobrých PHP programátorů je podstatně méně. A je to trochu handicap PHP, že těch lepičů je fakt mnoho.

        V každém případě zrovna webový hello-world je dnes už jednoduchý a většina wsgi frameworků ho má hned na první stránce dokumentace. Před 8mi lety byla ale situace o dost jiná, konec konců to byl taky důvod proč sem si začal psát vlastní.

        Pro mne i coby admina Apache, byl problém pochopit, jak funguje WSGI.

        1. Marek Olšavský avatar

          Jj, přesně tak. I lepiči i PHP vs. Python.

          Flask mi dal jen cestu jak mít přehledně řešené routes (což jsem nemohl říct o CherryPy), pořešení http(s), napojení na šablony a nesnaží se mi nanutit bambilion featur (jako Django).

  3. Karel avatar

    Jen otázka k zamyšlení.. Není lepší specializovat se více jen na jeden jazyk, než se učit celou řadu frameworků / jazyků? 🙂

    1. Marek Olšavský avatar

      Díky za komentář.

      Myslím si, že být specialista na jediný jazyk může být solidní pastí. Dneska i „obyčejný“ web je PHP[nebo něco jiného] + JavaScript + HTML + CSS + SQL (takže 5 jazyků). O produkci třeba účetního SW ani nemluvím, to je často nějaký_jazyk + SQL [a nemylím tím zrovna nějakou elementární znalost, protože účto je často víc dat než málo, ale daleko od pojmu „velká data“] a nakonec i makrování pro Excel/Calc. Mění se i ekosystém, jazyky/frameworky vznikají a zanikají, že jsem kdysi uměl Forth už snad ani nikde nepíšu.

      Při určitém balíku zkušenností a znalostí je změna jazyka a frameworku víceméně jen o referenční příručce, principy nebývají nějak drasticky jiné. Tedy pokud neřeším funkcionální, procedurální, objektové programování. Myslím si, že dobré znalosti matematiky mi dávají velkou výhodu v chápání operací v databázích.

    2. Miroslav Koula avatar

      Tady souhlasím s Markem. Vnímám vývoj webu od roku 1998, kdy jsme začal s ASP1.0/PHP3.0 a to jsem již už znal aspoň v základu HTML. A tak nějak vnímám posun za posledních několik let. Dřícve jeden člověk dělal všechno, někdy okolo roku 2003-2004 se začali ve firmách dělit lidi na programátory a kodéry, alespoň v ČR. Jedni dělali backend a druzí jen frontend.

      Jenže dneska už se to tak strašně roztříštilo, že najít skutečného full stack programátora je hodně těžké a těch co si ten titul zaslouží znám velmi málo.

      Frontend, pokud vynechám Javascriptové programátory v Angularu, Meteoru, Reactu atp., byl dříve jen o HTML, CSS a nějakém Javascriptu, povětšinou s jQuery. Jenže pak přišel SASS a LESS, pak nám přišli task runnery Grunt, Gulp atp. Pak se začal posunovat i vývoj Javascriptu. Přišlo node a npm, bower atp. Takže už to zas není taková sranda…

      Do toho backend byl dlouho jen o Apache, MySQL, PHP. Pak přišel nginx a frameworky. Pracoval jsem na mnoha projektech, kde mixují frameworky podle jejich vlastností. Frontend jel v rychlém Yii, backend v robustním Zendu, pak se přešlo na Symfony2, ale hledala se rychlost a tak se frontend udělal ve Phalconu… Jiné projekty se už vyloženě rozdělili na microservices a i zde se jede na Symfony, Phalconu, Laravelu. Jenže nám přišli kromě SQL databází i potřeby noSQL databází a tak se člověk musí chtě nechtě naučit Elasticsearch nebo Mongo atp. Samotná AWS architektura stojí mimo a kopíruje své služby + cloudová řešení těch známých. Mnoho projektů přešlo z Memcache na Redis a začali používat rozšířenou logiku Redisu a Lua. Už se nadechujete a všichni virtualizují, takže už to nemáte u sebe, ale jedete ve Vagrantu nebo Dockeru. No a cron skripty jednou za minutu, top už je zastaralé a tak musíte umět RabbitMQ nebo podobné…
      O nějakém Gitu (SVN) se ani nezmiňuju….

      Prostě mi přijde, že dneska už to není o jazyku, ten dělá tak 20-30% všeho co člověk musí umět, aby vůbec byl schopen postavit nějakou střední až větší webovou aplikaci se vším všudy … 😀

      1. Ondřej Tůma avatar

        Jako odpůrce extrémů musím konstatovat že pravda je někde uprostřed. Je rozhodně škoda zůstat u jednoho jazyka. Co jazyk to specifika v přístupu k problémům. To se týká ale i platforem (jednočipy vs. web vs. těžké aplikace). A různý pohled na věc, tedy různé řešení problému obzor jedině rozšíří, což je rozhodně dobře.

        Jsem názoru, že devatero řemesel, desátá bída platí i v IT. Dělení na front-end a back-end smysl má. Něco málo proč tomu tak je v mém článku https://zeropage.cz/a/proc_javascript_nenahradi_backendove_jazyky