CGI

Co to je CGI

CGI je zkratka pro Common Gateway Interface, což je rozhraní specfikující jakým způsobem předávají vaše webové prohlížeče informace serveru. Toho se využívá především při generování dynamických www stránek, které generuje nějaký (cgi) program.

Zde se dozvíte, jak váš program napsaný v Pythonu tyto informace získá od serveru (Apache) a jakým způsobem je předá zpět prohlížeči.

Instalace

Je třeba, abyste měli nainstalovaný nějaký server. Vzhledem k tomu, že používám server Apache 2, popíšu zde některé jeho „konfigurační záležitosti“.

  1. Apache je třeba nejdříve nainstalovat a zkonfigurovat internetové připojení; pokud internet nemáte tak stačí loopback. To je věc, která nemá s Pythonem nic společného a vydalo by to na samostatnou knihu, tak se tím tady zabývat nebudu. V Linuxových distribucích je toto po nainstalování Apache obvykle automaticky nastavené.
  2. Je třeba vědět, kde můžete CGI programy mít. Server Apache povoluje (vzhledem k bezpečnosti) spouštět CGI programy jen z adresářů k tomu určených. Které to jsou najdete v souboru jménem /etc/apache2/httpd.conf, nebo tak nějak – tento soubor se může v různých distribucích Linuxu (o Windows nemluvě) jmenovat různě (například /etc/httpd/httpd.conf). V tomto souboru najděte řádku s klíčovým slovem ScriptAlias.

    SciptAlias /cgi-bin/ /usr/lib/cgi-bin/

    Z tohoto řádku vyčtete, že je možné CGI programy ukládat do adresáře /usr/lib/cgi-bin/ a v prohlížeči se na ně odkazujete cestou /cgi-bin/program.cgi". Takových ScriptAliasů můžete zadat více.

  3. Další možností je povolit spouštění CGI programů v direktivě <Direcotry>. Pro adresář public_html všech uživatelů Linuxu může direktiva vypadat nějak tatko:

    <Directory /home/*/public_html/cgi-bin/ >
     Options ExecCGI
     AddHandler cgi-script .cgi .py
    </Directory>

    Nastavování uživatelských adresářů může být v nějakém extra souboru, např. /etc/apache2/mod_userdir.conf.

    Restartujte Apache a do prohlížeče zadejte něco jako http://localhost/~username/cgi-bin/program.cgi.

Soubor program.cgi je skript Pythonu (popravdě, nemusí to být jen Python :-). Nezapomeňte, že takový skriput musí mít (v Linuxu) nastaveno právo spouštění.
Přípona .cgi není povinná (jen se běžně používá pro CGI programy), můžete použít i .py – záleží to na direktivě AddHandler, jaké přípony vyjmenovává.

Odpověď prohlížeči

Nejdříve ukáži, co je třeba udělat, aby CGI program komunikoval s prohlížečem. Budu předpokládat, že Vaše CGI programy jsou spouštěny serverem z adresáře /usr/lib/cgi-bin/ a ScriptAlias tohoto adresáře je /cgi-bin/.

Apache může být zkonfigurován tak, aby obyčejný uživatel mohl vytvářet CGI programy v podadresáři domovského adresáře public_html. Pokud nemáte přístup do /usr/lib/cgi-bin/ (nebo něčeho takového, záleží na konfiguraci Apache) vyzkoušejte tuto možnost.

Nejdříve je třeba poslat prohlížeči hlavičku HTTP, aby prohlížeč věděl, co má od serveru očekávat. První řádek HTTP hlavičky určuje, jaká data budou následovat. Například:

Content-type: text/plainBude posílán obyčejný text.
Content-type: text/htmlText ve formátu HTML
Content-type: image/jpgObrázek ve formátu jpg

Další důležitou informací v hlavičce by mělo být, jaký typ kódování používáte (pokud posíláte text nebo HTML). V Linuxu to bude nejspíš UTF-8, ve Windows windows-1250 (ale raději i tam používejte UTF-8). Pokud nepoužíváte kódování, vystačíte si s us-asci.

Hlavička může obsahovat více informací než jenom jestli posíláte text či obrázek, ale prozatím to bude stačit. Hlavičku ukončí prázdný řádek.. Teprve po skončení hlavičky je možné odeslat prohlížeči obsah (HTML, text, obrázek).

Teď už víte vše, co je potřeba k napsání jednoduchého CGI programu. V adresáři /usr/lib/cgi-bin/ vytvořte soubor pokus.cgi a zapište do něj následující:

#! /usr/bin/env python3
#
# prvni cgi progarm v Pythonu

print('Content-type: text/plain; Charset="UTF-8"')
print('')              # hlavicka ukoncena prazdnym radkem
print('Hello World')

Souboru nastavte práva ke spouštění (chmod +x program.cgi). Aby mohl Váš program spouštět Apache, je třeba nastavit právo spuštění nejen uživateli, ale i ostatním uživatelům:

$ chmod o+x program.cgi

Pokud to neuděláte, dostanete error 500.

Více se o vytvoření spustitelného programu dozvíte v kapitole Hello World.

Požadavek prohlížeče

Teď jen stačí do Vašeho prohlížeče zadat adresu http://localhost/cgi-bin/program.cgi nebo http://localhost/~username/program.cgi a měli byste vidět Hello World.

Doména localhost reprezentuje váš počítač (počítač, na kterém běží server Apache). Pokud máte soubor uložen v adresáři public_html a váš login (tedy jméno, pod kterým se přihlašujete k počítači) je username, zadejte tu druhou možnost.

Váš prohlížeč by měl zobrazit Hello World. Pokud se nezobrazí nic, pak jste zadali adresu špatně. Zkontrolujte si vaší konfiguraci Apache. Pokud se Vám vrátí zdrojový text programu program.cgi, pak je buď v adresáři ve kterém server neumožňuje spouštět CGI, nebo jste nezadali správně práva spuštění k souboru program.cgi. Třetí možností chyby by bylo, kdybyste v CGI programu zadali špatně hlavičku – pro jistotu dbejte na velikost písmen.

Pokud v CGI programu dojde k chybě, (třeba v syntaxi, nebo když dojde k nějaké výjimce), nebo nenastavíte správně práva spuštění, vrátí vám server chybu 500 Internal Server Error. Detaily chyby najdete v souboru /var/log/apache2/error_log (nebo tak někde).

Proměnné prostředí

Pokud se vám program program.cgi podařilo spustit, máte vyhráno. Můžete tvořit dynamické stránky. Můžete si zaznamenávat kdo a kdy si tento CGI program vyžádal (třeba pomocí Modulu mx.DateTime), sčítat kolikrát (oblíbené počítadla) a vše si zaznamenávat do textového souboru, nebo třeba databáze PostgreSQL.

Možná Vás budou zajímat informace, jako například který webový prohlížeč si o informace žádá, z jakého počítače atd. Tyto informace server Apache předává programu jako proměnné prostředí.

Kdesi v paměti vytvoří takovou tabulku, která má dva sloupce: NÁZEV a HODNOTu. Například pod názvem HTTP_USER_AGENT se skrývá identifikace prohlížeče, který si žádá spuštění vašeho programu.

Tyto informace získáte pomocí Pythonovského modulu os a jeho atributu environ.

Spusťte Python v interaktivním režimu, načtěte modul os a vytiskněte environ.

rimmer: $ python
Python 2.1.3 (#1, Apr 20 2002, 10:14:34)
[GCC 2.95.4 20011002 (Debian prerelease)] on linux2
Type "copyright", "credits" or "license" for more information.
>>> import os
>>> print os.environ
{'HOME': '/home/rimmer', '_': '/usr/bin/python', 'PS1': '\\u: \\$ ',
'LS_OPTIONS': '--color', 'MAIL': '/var/mail/rimmer', 'USER': 'rimmer',
'LOGNAME': 'rimmer', 'HUSHLOGIN': 'FALSE', 'PATH':
'/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11',
'OLDPWD': '/usr/lib', 'SHLVL': '1', 'PWD': '/usr/lib/cgi-bin',
'SHELL': '/bin/bash', 'TERM': 'linux', 'HZ': '100'}
>>>

Hodnoty jsou v atributu environ uloženy jako slovník. Všimněte si, že environ neobsahuje slibovanou hodnotu HTTP_USER_AGENT. Tuto a jí podobné hodnoty totiž do proměnných prostředí přidává server Apache. Upravte CGI program program.cgi tak, aby vypisoval všechny klíče a proměnné:

#! /usr/bin/env python3
#

print('Content-type: text/html; Charset="UTF-8"')
print('') # hlavicka ukoncena prazdnym radkem

print('<html><body>')
import os
for i in os.environ.keys():
        print('<strong>'+i+'</strong>: '+os.environ[i]+'<br />')

print('</body></html>')

Výstup bude vypadat nějak tatko (výstup jsem zkrátil):

REQUEST_METHOD: GET
PATH: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11
SERVER_PROTOCOL: HTTP/1.1
QUERY_STRING:
SCRIPT_FILENAME: /home/username/public_html/cgi-bin/index.py
HTTP_HOST: localhost
SCRIPT_NAME: /~petr/cgi-bin/index.py
DOCUMENT_ROOT: /home/petr/public_html/czgbc/
REMOTE_PORT: 58353
SERVER_SOFTWARE: Apache/2.2.22 (Linux/SUSE)

HTTP_USER_AGENT: Mozilla/5.0 (X11; Linux i686; rv:2.0) Gecko/20100101 Firefox/4.0 Opera 12.15
REQUEST_URI: /~petr/cgi-bin/index.py
Komentář Hlášení chyby
Created: 11.9.2005
Last updated: 1.9.2015
Tato stánka používá ke svému běhu cookies, díky kterým je možné monitorovat, co tu provádíte (ne že bych to bez cookies nezvládl). Také vás tu bude špehovat google analytics. Jestli si myslíte, že je to problém, vypněte si cookies ve vašem prohlížeči, nebo odejděte a už se nevracejte :-). Prohlížením tohoto webu souhlasíte s používáním cookies. Dozvědět se více..