LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Perl (82) - CGI - první skripty

Perl Napíšeme první CGI skript a vysvětlíme jeho strukturu.

29.6.2009 01:00 | Jiří Václavík | Články autora | přečteno 11234×

Na úvod poznamenejme, že CGI skripty mohou být napsané prakticky v jakémkoliv programovacím jazyce, který je na serveru (nebo počítači z něj dostupném) interpretovatelný. Lze použít například Perl, Python, Bash, C a máte-li nějaký vlastní jazyk, tak ten také. Právě s Perlem bylo CGI v minulosti spojováno velmi často.

Archiv CPAN nabízí několik modulů usnadňujících tvorbu CGI skriptů. O několik dílů později se jednomu takovému s názvem CGI budeme věnovat. Nyní však budeme postupovat bez podpůrných modulů, protože tak lze snáze problematiku pochopit.

První CGI skript

V každém nekompilovaném CGI skriptu musíme uvést několik věcí.

  • pomocí čeho zpracovat skript (například pomocí Perlu - informace pro webový server)
  • co je výsledkem našeho skriptu (HTML soubor, text, obrázek, atd. - informace pro nějaký klientův prohlížeč)
  • samotný skript

Úvodní řádek určuje cestu k interpretu a vypadá následovně.

#!/cesta/k/interpretu

Dále je třeba pro webový prohlížeč na straně klienta uvést hlavičky dokumentu dle příslušného HTTP standardu. Zde uvedeme bez podrobnějšího vysvětlování jen to, co je nezbytně nutné.

Zopakujme, že nyní jsme v druhém bodu a uvedeme tedy, jaké povahy je výsledek interpretování. Je nutné specifikovat MIME typ zprávy. Zde záleží na tom, co budeme chtít, aby náš CGI skript generoval.

MIME je typ dat. Mezi základní kategorie datových typů patří application, audio, example, image, message, model, multipart, text a video. Každý z nich pak může nabývat různých podtypů. Pro čistý text použijeme MIME text/plain, pro text formátovaný v HTML text/html apod. Více o MIME typech lze nalézt na www.iana.org.

MIME typ uvedeme v hlavičce s názvem Content-type. Bude-li výsledkem CGI skriptu HTML dokument, pak jako druhý řádek CGI skriptu napíšeme toto.

print "Content-type: text/html\n\n";

Protože HTTP protokol vyžaduje prázdný řádek mezi hlavičkou a tělem zprávy, je mezi nimi sekvence "\n\n". Tím jsme dokončili část s hlavičkami a nyní tedy můžeme začít psát vlastní tělo programu.

Protože jsme uvedli jako MIME typ text/html, bude náš skript generovat HTML dokument - měli bychom tedy dodržet HTML strukturu (přesněji řečeno, webový prohlížeč to předpokládá a bude se podle toho chovat). Abychom přidali stránce "dynamičnost", zobrazíme aktuální čas.

my $now = localtime;
print << "HTML";
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
    <TITLE>Hello World</TITLE>
</HEAD>
<BODY>
<H2>Hello world</H2>
$now
</BODY>
</HTML>
HTML

Nyní tento program spustíme nejprve v příkazovém řádku.

$ perl /usr/local/apache2/cgi-bin/hello.cgi
Content-type: text/html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML>
<HEAD>
    <TITLE>Hello World</TITLE>
</HEAD>
<BODY>
<H2>Hello world</H2>
Sun Jun 18 19:02:38 2009
</BODY>
</HTML>
$

V podstatě se stalo přesně to, co bychom očekávali. Vygeneroval se nám HTML dokument s nějakou úvodní hlavičkou navíc.

Nyní můžeme zkusit spustit skript v prohlížeči. Pokud zadáme jako umístění /usr/local/apache2/cgi-bin/hello.cgi, zobrazí se zdrojový kód CGI skriptu (nikoliv jeho výstup a už vůbec ne interpretovaný HTML dokument).

Statické zobrazení obsahu souboru

Statické zobrazení obsahu souboru

Nyní spustíme CGI skript prostřednictvím webového serveru. Nastartujeme tedy webový server a do prohlížeče zadáme příkaz http://localhost/cgi-bin/hello.cgi. Pokud jde vše, jak má, měli bychom spatřit jednoduchou dynamicky vygenerovanou HTML stránku.

Dynamicky vygenerovaný HTML dokument

Dynamicky vygenerovaný HTML dokument

Tento CGI program je velmi jednoduchý. Hlavním důvodem je, že od uživatele nepřijímá žádná data a zpracovává pouze informaci serveru o aktuálním čase.

Pokud bychom zadali do hlavičky Content-type místo text/html například text/plain, práce pro server by zůstala stejná. Lišila by se však interpretace výsledku v prohlížeči. Jak by se takový dokument zobrazil, si můžete vyzkoušet nebo se podívat na obrázek.

Dynamicky vygenerovaný textový dokument

Dynamicky vygenerovaný textový dokument

Pro představu doplňme, že hlaviček je mnohem více, než jen povinná výše používaná hlavička Content-type. A dokonce oproti předchozímu ani hlavička Content-type nemusí být uvedena. V takovém případě však je nutné uvést hlavičku Location, jejímž parametrem je odkaz na umístění. Ostatní hlavičky jsou volitelné. Zde máme příklad Location hlavičky, která přesměruje na www.linuxsoft.cz.

print "Location: http://www.linuxsoft.cz\n\n";

Ladění CGI skriptů

Než začneme psát další CGI skripty, je užitečné mít na vědomí, že CGI skript je stále perlový skript a že ho je možné stále spustit v textovém režimu. Zdůrazňujeme to proto, že WWW prohlížeč nám neukáže standardní chybový výstup a v případě chyby bychom mohli být překvapeni, proč se nic neděje.

Absence chybového výstupu je značný hendikep, neboť hledat chybu bez jakýchkoliv hlášení je mnohdy téměř nemožný úkol.

Dobrou a jednoduchou metodou pro ladění je spuštění CGI skriptu příkazem perl a sledovat výstup v konzoli. Jinou možností je kontrola log souborů apache. V /usr/local/apache2/logs/error_log bychom měli najít chybový výstup našich CGI skriptů.

Proměnné prostředí

Webový server obvykle nastavuje pro CGI skript některé speciální proměnné prostředí. Odtud můžeme čerpat zejména informace o serveru, ale jsou zde i položky, které charakterizují požadavek uživatele. Proměnné prostředí nám jsou v CGI programu přístupné z hashe %ENV. Tyto proměnné prostředí uvádí následující tabulka.

Je nutno podotknout, že záleží pouze na serveru, které proměnné budou dostupné. Také se mohou názvy proměnných v detailech lišit. Informace o serveru obvykle začínají prefixem SERVER_. Data o uživateli, který zaslal požadavek, jsou zase dostupná přes REMOTE_.

ProměnnáHodnota
REQUEST_METHODmetoda vstupu dat
QUERY_STRINGřetězec vstupních dat předaných metodou GET
CONTENT_TYPEtyp dat od uživatele
CONTENT_LENGTHmaximální délka vstupu pro metodu POST
GATEWAY_INTERFACEverze CGI ve formátu CGI/verze
AUTH_TYPEzpůsob autentifikace uživatele
REQUEST_URIURL bez doménového jména
SCRIPT_FILENAMEcesta ke skriptu od adresáře /
SCRIPT_NAMEcesta ke skriptu z pohledu serveru
REMOTE_ADDRIP ppočítače uživatele
REMOTE_HOSTdoménové jméno počítače uživatele
REMOTE_PORTport uživatele
SERVER_ADDRIP serveru
SERVER_ADMINkontakt na administrátora serveru
SERVER_NAMEdoménové jméno serveru
SERVER_PORTport serveru
SERVER_PROTOCOLprotokol a verze
SERVER_SOFTWAREjméno a verze serveru a modulů

Nastavují se také proměnné podle přijatých hlaviček. Jsou tak dostupné například HTTP_ACCEPT, HTTP_ACCEPT_CHARSET, HTTP_ACCEPT_ENCODING, HTTP_ACCEPT_LANGUAGE, HTTP_CONNECTION, HTTP_COOKIE, HTTP_HOST, HTTP_USER_AGENT.

Pro konkrétnější představu o tom, jakých hodnot jednotlivé proměnné nabývají si předveďme jednoduchý CGI program, který vypíše obsahy proměnných prostředí.

#!/usr/bin/perl
print "Content-type: text/plain\n\n";
foreach $p (sort keys %ENV) {
    $h = $ENV{$p};
    print "$p=$h\n";
}

CGI a bezpečnost

Při psaní webových aplikací si je dobré uvědomit, že každá neošetřená hodnota, která přijde od uživatele, je nakažená. Vždy předtím, než začneme pracovat s přijatými daty, je musíme vyléčit. Aby bylo ošetřování vynuceno, doporučuje se skripty spouštět s parametrem -T.

O nakaženém režimu již v rámci seriálu vyšel zvláštní díl.

Verze pro tisk

pridej.cz

 

DISKUZE

WSGI 1.7.2009 13:36 Petr M.
L Re: WSGI 6.7.2009 00:11 Jiří Václavík
CGI a práva 14.7.2009 18:31 Martin Chudoba
  L Re: CGI a práva 19.7.2009 15:59 Petr M.
    L Re: CGI a práva 19.7.2009 22:17 Martin Chudoba




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

1.12.2016 22:13 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.
Komentářů: 1

4.9.2016 20:13 /Pavel `Goldenfish' Kysilka
PR: Dne 22.9.2016 proběhne v Praze konference Cloud computing v praxi. Tématy bude např. nejnovější trendy v oblasti cloudu a cloudových řešení, provozování ERP v cloudu, o hostování různých typů softwaru, ale třeba i o zálohování dat nabízeném podnikům formou služby.
Přidat komentář

1.9.2016 11:27 /Honza Javorek
Česká konference o Pythonu, PyCon CZ, stále hledá přednášející skrz dobrovolné přihlášky. Máte-li zajímavé téma, neváhejte a zkuste jej přihlásit, uzávěrka je již 12. září. Konference letos přijímá i přednášky v češtině a nabízí pomoc s přípravou začínajícím speakerům. Řečníci mají navíc vstup zadarmo! Více na webu.
Přidat komentář

27.8.2016 8:55 /Delujek
Dnes po 4 letech komunitního vývoje vyšla diaspora 0.6.0.0
diaspora* je open-source, distribuovaná sociální síť s důrazem na soukromý
Více v oficiálním blog-postu
Přidat komentář

24.8.2016 6:44 /Ondřej Čečák
Poslední týden CFP LinuxDays 2016; pokud byste rádi přednášeli na LinuxDays 2016 8. a 9. října v Praze, můžete svůj příspěvek přihlásit, následovat bude veřejné hlasování.
Přidat komentář

9.8.2016 22:56 /Petr Ježek
Zařazení souborového systému reiser4 do jádra 4.7 znamená konečně konec patchování jádra jen kvůli možnosti použít reiser4.
Přidat komentář

12.7.2016 13:14 /František Kučera
Spolek OpenAlt zve na 130. distribuovaný sraz příznivců svobodného softwaru a otevřených technologií (hardware, 3D tisk, SDR, DIY, makers…), který se bude konat ve čtvrtek 21. července od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).
Přidat komentář

11.7.2016 16:53 /Redakce Linuxsoft.cz
Konference LinuxDays hledá přednášející. Přihlášky poběží do konce prázdnin, v září bude hlasování a program. Více na https://www.linuxdays.cz/2016/cfp/.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

10.12.2016 11:01 / jeorge
kitchen designer

7.12.2016 8:10 / Hamon
scottish cottages

4.12.2016 22:54 / František Kučera
Dárek

9.11.2016 7:42 / Mane
hardwood floor waxing

8.11.2016 13:38 / Mira
Konfigurace maldet na Centos serveru

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2016) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze