Anzitutto assicuriamoci di avere Python installato sul nostro computer. Nel mio esempio procederò con l’installazione su Windows, ma anche nel caso di un server Linux la procedura è pressoché la medesima.
1. Individuiamo la cartella di installazione di Python
Nel mio caso l’eseguibile di Python si trova in D:/Python27/python.exe
Appuntiamoci questo valore perché ci servirà per dopo.
2. Configuriamo Apache modificando il file httpd.conf
Utilizzando XAMPP è sufficiente aprire il pannello di controllo e recarsi su Apache > Config > Apache (httpd.conf)
3. Aggiungiamo il handler per gli script cgi
In fondo al file di configurazione aggiungiamo le seguenti due righe per attivare la gestione degli script cgi
1 2 |
AddHandler cgi-script .py ScriptInterpreterSource Registry-Strict |
In questo modo permettiamo ad apache di interpretare i file con estensione .py come script eseguibili mediante applicazioni interne al computer.
4. Aggiungiamo index.py alle pagine di default
Esattamente per quello che succede per index.htm oppure index.php, vogliamo che anche index.py venga letta come pagina predefinita di una cartella. (potremmo metterne anche altre a piacere)
Per farlo modifichiamo sempre il file httpd.conf che abbiamo aperto prima. Identifichiamo il punto dove c’è scritto <IfModule dir_module>
e modifichiamo la configurazione nel modo seguente, aggiungendo index.py all’elenco
1 2 3 4 5 |
<IfModule dir_module> DirectoryIndex index.php index.pl index.cgi index.asp index.shtml index.html index.htm \ default.php default.pl default.cgi default.asp default.shtml default.html default.htm \ home.php home.pl home.cgi home.asp home.shtml home.html home.htm index.py </IfModule> |
5. Riavviamo apache
Che lo si stia facendo su XAMPP, oppure su un server LAMP, a questo punto riavviamo Apache, banalmente premendo Stop e Start in sequenza.
6. Creiamo la prima pagina in Python
Dentro la cartella htdocs
creiamo una cartella a piacere, che allo scopo di questo esempio io chiamerò python
.
Dentro la cartella creiamo un file chiamato index.py con dentro le seguenti istruzioni:
1 2 3 4 |
#!D:/Python27/python.exe print("Content-Type: text/html\n") print ("Ciao mondo!") |
Ricordiamoci l’indirizzo preso all’inizio al punto 1. Il percorso di installazione di Python andrà incluso in ciascun file. Inoltre è essenziale il primo print, che permette al browser di interpretare il contenuto come una pagina html.
Le prime 2 righe dovranno essere presenti in ogni pagina che si occuperà dell’output.
7. Esempio di una pagina semplice
Ovviamente dovremo aggiungere tutti gli opportuni tag del HTML, cosa che potremmo fare in questo modo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#!D:/Python27/python.exe print("Content-Type: text/html\n") pagina = """ <!DOCTYPE html> <html> <head> <title>Pagina in Python</title> </head> <body> <h1>Ciao mondo!</h1> </body> </html> """ print pagina |
8. Raccogliere i dati da POST e GET
Infine vediamo come raccogliere i dati dai due metodi principali con i quali l’utente può interagire con la nostra pagina web, il get e il post.
Per farlo importiamo anzitutto la libreria CGI aggiungendo in cima al file, dopo il percorso all’eseguibile di Python, import cgi
Avremo bisogno anche di gestire eventuali errori che se no non verranno mostrati nell’output. Per farlo importiamo anche cgitb aggiungendo le seguenti due righe:
1 2 |
import cgitb cgitb.enable() |
L’intestazione del nostra file diventerà:
1 2 3 4 5 6 |
#!D:/Python27/python.exe import cgi import cgitb cgitb.enable() print("Content-Type: text/html\n") |
A questo punto per raccogliere i dati, sia da POST che da GET utilizziamo l’istruzione dati = cgi.FieldStorage()
Modifichiamo tutta la pagina per funzionare con un piccolo form che utilizzi entrambi i metodi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#!D:/Python27/python.exe import cgi import cgitb cgitb.enable() print("Content-Type: text/html\n") extra = "" dati = cgi.FieldStorage() if "dati_form" in dati: if dati["dati_form"].value == "1": extra = "<h1>valore: " + dati["valore"].value + "</h1>"; pagina = """ <!DOCTYPE html> <html> <head> <title>Pagina in Python</title> </head> <body> <form action="?dati_form=1" method="post"> Valore: <input type="text" value="" name="valore"> <input type="submit" value="invia" name="invia"> </form> """+extra+""" </body> </html> """ print pagina |
Faccio notare che se si cerca di chiamare la pagina http://127.0.0.1/python/?dati_form=1
si incorrerà in un errore come il seguente (senza la suddetta libreria avremmo visualizzato una pagina bianca):
Questo perché la chiave valore
non è definita all’interno del contenitore dati
.
Aggiungiamo quindi un controllo nel modo seguente:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#!D:/Python27/python.exe import cgi import cgitb cgitb.enable() print("Content-Type: text/html\n") extra = "" dati = cgi.FieldStorage() if "dati_form" in dati: if dati["dati_form"].value == "1" and "valore" in dati: extra = "<h1>valore: " + dati["valore"].value + "</h1>"; pagina = """ <!DOCTYPE html> <html> <head> <title>Pagina in Python</title> </head> <body> <form action="?dati_form=1" method="post"> Valore: <input type="text" value="" name="valore"> <input type="submit" value="invia" name="invia"> </form> """+extra+""" </body> </html> """ print pagina |