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 :)
Ahoj,
no, ono pro začátečníky možná lepší než psát v čistém WSGI
je zkusit nějaký framework, tedy sadu knihoven a skriptů, která
dá webové aplikaci nějaký řád. Kromě těch známých a obrovských
jako Django, TurboGears, etc., za sebe mohu doporučit docela
minimalistickou hračku jménem web.py [http://webpy.org], která
se svou jednoduchostí blíží čistému WSGI (nepotřebuje
pětimegovou referenčku), jen se v tom o něco příjemněji píše
a existuje spousta hezkých návodů a tutoriálů (v angličtině).
Ale k Tvému problému: ona ta proměnná output tam není jen tak
pro srandu králíkům. Do ní patří to, co se vypisuje, printy
skončí někde v logu webserveru, či spíše v /dev/null. Takže
třeba by se pro začátek dal ten print nahradit něčím jako
output+="neco\n". Ale takhle ručně se text obvykle nevypisuje.
Pokud chceš generovat složitější stránky, je lepší poohlédnout
se po nějakém šablonovacím systému (který typicky vezme nějakou
textovou předlohu uloženou ve zvláštním souboru a doplní do ní
z programu data - tak je ve zdrojáku méně nepřehledného maglajzu
generujícího výstup) - ale to jen tak na okraj.
S pozdravem
Filip Štědronský
--
————————————————————————————————————————————————————————————————
http://regnarg.matfyz.cz ☼ Není důležité milovat fajn člověka,
je důležité, aby vám spolu bylo fajn
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 :)
> _______________________________________________
> Python mailing list
> Pyt...@py.cz
> http://www.py.cz/mailman/listinfo/python
Na začátek bych strašně rád poděkoval za nádherné odezvy, které mě
přivádějí na tu dle mého správnou cestu. Moje projekty navštěvuje více
než deset lidí. Celový traffik je 4TB měsičné, beží na VPS (ubuntu a
debian). Zpracovávám databáze o velikosti 100 a více mb. Příjde mě že
PHP je v tomto při velké návštevnosti strašně pomalé. Proto by mě
zajímalo zda není chyba používat python frameworky na velké projekty.
Pokud ne v čem by jste mě doporučili je dělat ? Rád bych si právě
udělal i vlastní administraci a nechtěl bych využívat něco co už je.
Ještě jednou děkuji :)
Čísla, která uvádíš, jsou několikařádově menší než třeba weby
Seznam.cz, které jsou implementovány v Pythonu. Nechci (a asi ani
nemůžu) popisovat, jaký framework je pro ně použit, ale nebude to
výkonově nic lepšího ani horšího než nějaký normálně navržený
Pythonový framework. Ať už již existující nebo co si sám člověk může
napsat.
Na druhou stranu třeba Facebook je celý v PHP. Myslím, že fakt, že
Facebook nedávno vydal (opensourcoval) překladač PHP do C++, a vůbec
existence různých PHP optimalizátorů a bytecode keší trochu naznačuje
jisté výkonové nedostatky PHP, ale ono PHP na tom není až tak špatně.
Naopak, pokud vím, je to jeden z nejrychlejších interpreterů. Bohužel
v rukávu zrovna nemůžu najít odkaz na nějaký důvěryhodný test.
Problém opět není v rychlosti toho či onoho, ale v tom, jak to celé
funguje - PHP skript i se všemi includovanými knihovnami se musí
načíst, zparsovat a zinicializovat při každém HTTP požadavku. Toto se
u dlouhoběžící Pythonové aplikace děje jen při spuštění, obsluha
každého jednotlivého HTTP požadavku je pak o tento rozdíl rychlejší.
(Pojmem dlouhoběžící myslím, že to nesmíš nakonfigurovat zrovna jako
CGI nebo nějak podobně, to pak o popsanou výhodu samozřejmě
přicházíš.)
Když už máš webovou aplikaci nataženou v paměti a ona tam zůstává
(tzn. není smazána na konci prvního požadavku, jako se to obvykle děje
v PHP), můžeš s tím dělat psí kusy. Můžeš si třeba přímo v paměti (v
nějakém objektu apod.) kešovat data, vygenerované stránky, výsledky z
databáze... Pokud použiješ šablonovací engine (jako že asi ano), bývá
obvyklé, že obsahuje nějaký loader, který také kešuje načtené šablony.
Můžeš si v nějakém poolu uchovávat i samotná databázová spojení (to v
PHP jde taky, říká se tomu persistentní spojení, ale někdy to bývá
vypnuté).
Abych začal odpovídat nějak konkrétně:
> Příjde mě že PHP je v tomto při velké návštevnosti strašně pomalé.
Viz výše :) Záleží na tom, co konkrétně ty PHP skripty dělají.
> Proto by mě zajímalo zda není chyba používat python frameworky na velké projekty.
Myslím, že není. Existují nástroje, jako ab (Apache benchmarking tool)
nebo httperf, které ti změří, kolik požadavků za sekundu web zvládne.
Nevygenerují takovou zátěž, jakou ti udělají uživatelé, ale pro
změření, zda je to či ono dostatečně rychlé, to je dobré. Konečně,
všechno stejně může hodně (pozitivně) ovlivnit kešování na
proxy/webserveru.
> Rád bych si právě udělal i vlastní administraci a nechtěl bych využívat něco co už je.
Dělej jak chceš. Já dělám také :) "Velké" frameworky na to mají
fíčury, jako je koncept controllerů, scaffolding, generování formulářů
(s validací, načítáním názvů sloupců z databáze a tak). Ale zase to
dělají dost obecně a hlavně tak, aby to každý mohl použít. Když to
uděláš podle sebe, může to mít pro tebe lepší výsledky. Podle mě je
důležité se v tom vyznat, vědět jak to funguje jinde, abys při
vynalézání vlastního kola nevynalezl něco hranatého :) Jinak, pokud
zrovna otázku "framework ano nebo ne" nemusíš řešit se spolupracovníky
na projektu, se zadavatelem nebo s firemními zvyklostmi, je to asi
jedno.
PM
4TB mesicne je v podstate nezajimavy udaj, to nic nerika o
narocnosti jednotlivych aplikaci nebo webu. To muze udelat bittorrent
s minimalnimi naroky na pamet a (skoro) nemeritelnou zatezi procesoru.
Zkust uvest zpracovane HTTP pozadavky za sekundu pri beznem provozu
a ve spicce, pak se tim da nejak pracovat. Ale obecne se da rict, ze
ani v pripade "velkych" cisel ti nikdo nerekne, ze nemas pouzit Python
nebo PHP. I na jednoduche VPS se da na beznem webu udelat velka
spousta optimalizaci a kesovani, ktere dokazou radove zvysit vykon.
Zkus napsat trochu vic o tom, jak ty tve weby vypadaji...
Jirka
Tady nejde ani tak o moje projekty, byla to pouze ukazka ze bych se
rad zbavil PHP a zacal v necem co ma budoucnost. Problem nastava v tom
ze pracuju jako programator PHP. V praci si muzu diktovat v cem bude
redakcni system naprogramovany, proto bych rad presel na python. Proto
nemam v lasce moc frameworky s jednotnou administraci. Sice si muzu
vybrat v cem to budu programovat ale kolega si diktuje jak bude
administrace vypadat. Doufal jsem ze Python si nejak sikovne poradi s
vecma jako php viz. $_GET[] nebo $_POST[]. Proto se treba divim proc
nefunguje print(""); pro web ale pres konzoli ho rozjedu. Existuje
neco co by usnadnovalo praci s vecma jako je GET atd a pritom bych v
tom mohl delat i vlastni administraci a sablonovaci system ?
Připojuju se k předpisatelům a doporučuju poohlédnout se po frameworku.
Obavy z jeho nevýkonnosti mít nemusíš -- za předpokladu, že budeš
nějakou dobu na začátku věnovat učení, jak věci dělat správně. Práci s
frameworky je třeba se učit, nenaprogramuješ Hello world během 5 minut,
ale to učení se sakra vyplatí, ušetří čas, úsilí a zoufalství později.
Filosofie je trošku jiná než u PHP (kde v podstatě žádná není), ale
stojí na solidních základech.
Jsem příznivcem Djanga, existuje překlad jeho homepage:
http://djangoproject.cz/
Další články i tutoriální seriály v češtině najdeš velmi rychle sám.
Ať to jde.
--
\//\/\ : Vladimir Macek : http://macek.sandbox.cz : +420 608 978 164
Rozumím ale jak jsem jiz psal nejde tu ani tak o me. Me by jednotna
administrace vyhovovala ale v praci je administrace udela tak ze
uzivatel projizdi web a pomoci ikonky u textu si ho muze upravit. To
je to co me django nesplni.
Django tohle nevygeneruje "automaticky", ale není problém si to
naprogramovat. Uživatelské rozhraní se dá udělat jakkoli, ať už to je
separé administrace někde v /admin, nebo nějaká přímá editace, kód
který to bude obsluhovat se až tak lišit nebude.
--
S pozdravem
Martin Stiborský
Jabber: st...@njs.netlab.cz
Poslední tvrzení nechápu, kde ho berete? Django splní v podstatě
libovolné přání. Nikdo netvrdí, že to, co Django nazývá administrací
musíte za a. považovat i vy v práci. Klidně použijte automaticky
generovaný admin Djanga jen na low-level editaci pro správce dat nebo ho
zcela vypněte. Ale bude to škoda, je mocné, i když nebude ve vašem
hlavním workflow.
Přihodit editační ikonky k textu není nic složitého. Dokonce rovnou
vidím jQuery AJAXovou komunikaci s Djangem na pozadí, která to zařídí a
live nahradí. Není vyloučeno, že už pro Django nějaká tzv. aplikace na
podobný účel existuje. To je další výhoda zavedeného frameworku: lidé
pro něj píšou hromady znovuvyužitelného kódu.