[python] Python WSGI (začátečník)

Petr Messner petr.messner na gmail.com
Sobota Duben 24 17:34:51 CEST 2010


Ahoj,

zkusím ti to nejdřív nějak vysvětlit, pak ti odpovím na tvé konkrétní otázky a závěr ještě něco přidám. Sorry, vzhledem k formulaci a vlastně samotné existenci dotazu jsem se trochu více rozepsal.

Pro jistotu zde uvedu definici WSGI: je to lepidlo, pomocí kterého se slepí webový server a webový framework/webová aplikace; je to proto, aby každá aplikace/každý framework nemusel znovu a znovu implementovat HTTP, FastCGI, CGI atd. Místo toho jen webserver nebo FastCGI server nebo CGI handler (nebo cokoliv) jen poskytne WSGI rozhraní a aplikace/framework už se tím nemusí zabývat.

Ale stále toho k zabývání se ještě spousta zbývá. WSGI je low-level a nedělá nic jiného, než co jsem právě popsal. Mohl bys WSGI vzít a přidat do něj nějaké hezčí zpracování uploadu souborů, mohl bys do něj přidat spojení do databáze, logování atd., ale to už by pak nebylo hezké rozhraní, ale pěkný moloch. Byl by to webový framework. Úkolem WSGI není být webovým frameworkem, ale umožnit webovým frameworkům fungovat nezávisle na tom, jestli budou spuštěny přes CGI, FastCGI nebo nějak jinak.

Takže:

1. pokud chceš v Pythonu dělat weby, nedělej je čistě ve WSGI, ale najdi si knihovnu nebo framework, která bude řešit ty nejotravnější věci (upload souborů apod.) Může to být buď full-stack framework jako třeba Django nebo Pylons, nebo to může být knihovna, která dělá primárně právě jen tohle, např. Werkzeug, Paste WebOb, yaro, ... Je toho mraky. Mezi tím jsou ještě další věci, např. CherryPy. A pak ještě speciality, jako Zope nebo Twisted.

2. statistiky na webu bývají pochybné kvality, nejlepší je se o výkonu něčeho přesvědčit sám. Na co psát něco ultra-efektivně, když tam stejně poleze jen deset lidí denně - místo toho to dělej tak, abys z toho měl sám radost a měl s tím co nejméně práce. Na druhou stranu, pro jakýkoliv dobře nakonfigurovaný způsob nasazení webové aplikace by neměl být problém zvádnout stovky požadavků za sekundu, a pokud bude požadavků více, stejně při takovém provozu se už asi dávno budeš poohlížet po dalším železe.

3. že nechceš používat mod_python já osobně chválím :) I když pro to mám jiné důvody, než statistiky na webu. WSGI je univerzálnější. (Ne že by v mod_pythonu nešel použít WSGI handler, věřím, že je zde řeč o standardním mod_python publisheru.) Mimochodem, abychom předešli obvyklému počátečnímu zádrhelu - WSGI není to samé, co mod_wsgi. Jedno je rozhraní a druhé je jedna z implementací tohoto rozhraní pro Apache.

4. proč ti nefunguje ten print samozřejmě nevím, ale vzhledem k tomu, že print vypisuje na standardní výstup, asi to bude tím, že svoji aplikaci spouštíš pomocí něčeho, co ten standardní výstup zavírá. Třeba kdybych já pomocí printu něco napsal, tak se mi to vypíše rovnou do konzole, kde je webovka spuštěná (tedy ne uživateli do prohlížeče), a na serveru standardní výstup bývá (když není zavřený) přesměrovaný do /dev/null, takže se to zapíše víš kam. Používat print ve webové aplikaci lze jen na ladění, jinak je to asi stejný nesmysl jako používat ho v GUI aplikacích. Jo a jestli si chtěl napsat něco jako print("<html>... kilobajty balastu ...</html>"), tak použij šablonu, je to o dost jednodušší a přehlednější :)

Co by měl být tvůj další krok - doporučuji se podívat na Django. Je tu dost příznivců a uživatelů Djanga, takže i z tohoto pohledu je to perspektivní.

Kdybys nechtěl jít do Djanga, tak se zkus třeba podívat na http://werkzeug.pocoo.org/ a rozklikni si to "click here to see ...", je tam docela pěkná ukázka. Jak vidíš, snadno získáš objekt Request, ve kterém je vše co potřebuješ, odpověď vracíš objektem třídy Response a co děláš mezi tím je na tobě, to ti jako PHP programátorovi přijde asi bližší. Werkzeug není zrovna hodně používaná věc, ale mě se líbí, lze na ni demonstrovat, jak to dělat snadno a bez frameworkového molochu, proto to zde uvádím. Takových podobných nástrojů jako Werkzeug je více.

Vůbec pro PHP programátora bude asi největší problém to, že dělat něco v Pythonu nebo Ruby neznamená jen naučit se jazyk a třeba jen jeden způsob jak to zprovoznit, ale už při čtení prvního tutorialu se na tebe valí věci jako ORM, MVC, URL routing, testování, ideálně ještě základy Linuxu/BSD/.... Tím se nenech odradit.

Takže přeji hodně štěstí, ale stojí to za to :)

PM


PS. předpokládám, že tvůj další dotaz do této konference bude, kde na to najít hosting :)

On 24.4.2010, at 16:01, Thomix wrote:

> Zdravím,
> 
> už několik let programuju v php. Poslední dobou šilhám po python pro
> web. Nainstaloval jsem si modul WSGI a zkusil si par tutoriálů. Ovšem
> mám problém.
> 
> Např.:
> 
> def application(environ, start_response):
>    status = '200 OK'
>    output = 'hl'
> 
>    response_headers = [('Content-type', 'text/plain'),
>                        ('Content-Length', str(len(output)))]
>    start_response(status, response_headers)
> 
>    return [output]
> 
> Tomuto celkem rozumím ale nechapu jak v tom více programovat ??? Když
> si napíšu print("neco"); napiše to chybu a dále se to semnou nebaví.
> 
> Viz.:
> 
> def application(environ, start_response):
>    status = '200 OK'
>    output = 'hl'
>    print("neco");
> 
>    response_headers = [('Content-type', 'text/plain'),
>                        ('Content-Length', str(len(output)))]
>    start_response(status, response_headers)
> 
>    return [output]
> 
> Nějak nechápu v čem je problém. Mod_python nechci používat z důvodu
> slabé odezvialesponň dle statistik co jsem četl na internetu. Mohl by
> mě prosím někdo objasnit alespoň základ psaní ve WSGI ?
> 
> Děkuji :)
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python



Další informace o konferenci Python