Důvodem k napsání tohoto seriálu článků je hlavně to, že spousta programátorů, kteří chtějí programovat webové aplikace začíná s PHP. Sám osobně proti PHP nic nemám, já sám jsem na webu taky začínal s PHP. Dají se v tom napsat opravdu velké věci a dá se v tom programovat hodně pěkně. Ale myslím si, že to není uplně ta nejlepší cesta. Skriptovací, plně objektově orientovaný Python je vhodný a rychlý nástroj pro vývoj a troufám si říct, že podporuje zdravé programovací návyky. Proto, než se vydáte do světa Javy, C++, či jiného jazyka, zkuste se na chvíli zastavit v mezistanici Python a vyzkoušejte si cestu, kterou se vydaly takové firmy jako např: www.google.com, nebo www.seznam.cz.
Postupně bych se chtěl věnovat základní konfiguraci webserveru, práci s formuláři, práci s databází, se session. Výsledkem by měl být tento blog. Postupně budu používat mod_python, Teng a MySQL.
Předem bych chtěl upozornit, že Python (mod_python) není PHP a filozofií se blíží spíše k Javě (servlet API). Proto je potřeba kolem něj vybudovat určitou infrastrukturu, aby práce byla příjemnější. Já se zde budu snažit popsat to, co mě samému přijde jako rozumný kompromis. Veškeré další informace se budou týkat pouze světa Linuxu. Windows už jsem dávno opustil a některé technologie, které budu používat, nejsou pro windows portované. Sám používam Debian a proto instalace nezbytných součástí budou uvedeny pro tento systém, potažmo pro Ubuntu.
Tento první díl se bude týkat základního nastavení webserveru Apache pro práci s mod_pythonem. Takže hurá do toho a půl je hotovo. Jak do systému dostanete Apache a mod_python je na Vás, pro Debian (Ubuntu) bude stačit:
apt-get install apache2 apache2-mpm-prefork libapache2-mod-python
Nyní máme nainstalováno vše co zatím budeme potřebovat. Jako další krok si vytvoříme základní adresářovou strukturu, ve které si budeme hrát a rozjedeme si vlastní instanci apache na portu třeba 8000, tak abysme mohli začít testovat mod_python.
mkdir -p ~/blog/conf mkdir -p ~/blog/src mkdir -p ~/blog/bin mkdir -p ~/blog/log
do adresáře ~/blog/conf si připravíme konfiguraci pro webserver.
Aby jsme mohli webserver spustit, potřebujeme nějaký, alespoň minimální init skript. Takový velice jednoduchý jsem připravil zde. Doporučuji uložit do adresaře ~/blog/src.
Dále musíme vytvořil symlink na binárku webserveru. A v adresáři ~/blog/src vytvořit testovací soubor který budeme chtít serverem zobrazit.
wget http://media.karotka.cz/13/httpd.conf -O ~/blog/conf/httpd.conf wget http://media.karotka.cz/13/blog.sh -O ~/blog/src/blog.sh chmod u+x ~/blog/src/blog.sh ln -s /usr/sbin/apache2 ~/blog/bin/blog echo "Ahoj" > ~/blog/src/test.html
Po stažení je potřeba v konfiguráku ~/blog/conf/httpd.conf upravit váš home adresář. /home/uzivatel nahradit vlastním, celkem na třech místech. A pak už můžeme server spustit
~/blog/src/blog.sh start
Teď stačí otevřít prohlížeč a napsat http://localhost:8000/test.html a měli by jste vidět nápis "Ahoj". Pokud je tomu tak, webserver běží a můžeme se začít věnovat mod_pythonu.
V další části upravíme konfiguraci serveru tak, aby zpracoval request mod_python a zobrazil nějaký minimální výstup. V konfiguraci ~/blog/conf/httpd.conf odkomentujeme část týkající se mod_pythonu, vytvoříme první pythoní skript a restartneme server:
# v sekci
<Directory /home/uzivatel/blog/src>
# SetHandler python-program
# PythonHandler index
# PythonDebug On
# PythonAutoReload On
</Directory>
# odkomentujeme části týkající se mod_pythonu
<Directory /home/uzivatel/blog/src>
SetHandler python-program
PythonHandler index
PythonDebug On
PythonAutoReload On
</Directory>
# napr. takto v konzoli vytvorime skript
echo "from mod_python import apache" > ~/blog/src/index.py
echo "def handler(req):" >> ~/blog/src/index.py
echo " req.content_type='text/html'" >> ~/blog/src/index.py
echo " req.write('Ahoj svete.')" >> ~/blog/src/index.py
echo " return apache.OK" >> ~/blog/src/index.py
# restartneme server
~/blog/src/blog.sh
Vyzkoušíme prohlížeč, do kterého napíšeme http://localhost:8000/. Měli bychom vidět text "Ahoj svete".
Pokud tomu tak je, gratuluji k prvnímu pythonímu skriptu. V opačném případě vám mod_python vypíše, kde jste udělali chybu.
Kde se text vzal a jak to, že se zobrazil ? Podíváme se detailněji na konfiguraci sekce <Directory /home/uzivatel/blog/src> webserveru.
- SetHandler python-program - znamená, že všechno pro adresář /home/uzivatel/blog/src se má zpracovat jako python
- PythonHandler index - zpracuje ho skript index.py, ve kterém se zavolá metoda handler
- PythonDebug On - jakákoliv chyba bude vypsána do browseru jako html a bude vrácen HTTP status=200 OK. PythonDebug Off je při jakékoliv chybě vrácen status=500.
- PythonAutoReload On - server bude skript znova načítat a kompilovat a při každém requestu a jakékoliv změny se proto projeví bez restartu serveru.
Zpět k hlavní metodě handler. Té se předá jediný parametr, objekt typu mp_request, který obsahuje spoustu důležitých údajů pro práci s HTTP. Všechny jeho atributy si můžete zkusit vypsat např. tak, že skript ~/blog/src/index.py upravíme takto:
from mod_python import apache
def handler(req):
req.content_type='text/html'
for member in dir(req):
req.write(member)
req.write('<br>')
return apache.OK
Takže to je prozatím vše. V další části se budu věnovat tomu, jak zpracovat GET a POST data.
A na konec bych ještě dodal, že tento jednoduchý příklad zvládla i moje neprogramující přítelkyně na svém Kubuntu.
