Web development
Scarica zip esercizi
Introduzione
In questi esempi cercheremo di costruirci un piccolo server web, con librerie standard di Python.
ATTENZIONE: Tutorial sperimentale e incompleto!
Questo tutorial crea un sito web DA ZERO: ci sono modi più semplici di realizzare una webapp direttamente con Jupyter, per farlo segui prima il tutorial Interfacce utente
Che fare
scompatta lo zip in una cartella, dovresti ottenere qualcosa del genere:
web
_static
esempio.txt
web.ipynb
web-sol.ipynb
jupman.py
ATTENZIONE: Per essere visualizzato correttamente, il file del notebook DEVE essere nella cartella szippata.
apri il Jupyter Notebook da quella cartella. Due cose dovrebbero aprirsi, prima una console e poi un browser. Il browser dovrebbe mostrare una lista di file: naviga la lista e apri il notebook
web.ipynb
Prosegui leggendo il file degli esercizi, ogni tanto al suo interno troverai delle scritte ESERCIZIO, che ti chiederanno di scrivere dei comandi Python nelle celle successive.
Scorciatoie da tastiera:
Per eseguire il codice Python dentro una cella di Jupyter, premi
Control+Invio
Per eseguire il codice Python dentro una cella di Jupyter E selezionare la cella seguente, premi
Shift+Invio
Per eseguire il codice Python dentro una cella di Jupyter E creare una nuova cella subito dopo, premi
Alt+Invio
Se per caso il Notebook sembra inchiodato, prova a selezionare
Kernel -> Restart
Struttura del sito
Si suppone che tutti i file html, css, js etc vadano nella directory _static
In web_server.py
trovi il codice del server.
Facciamo partire il server
Apri Anaconda Prompt: per istruzioni su come trovarlo (o se non hai idea di cosa sia!), prima di proseguire leggi sezione interprete Python nell’introduzione
Una volta nella console del Prompt dei comandi (che è una finestra nera dove puoi immettere comandi testuali per il sistema operativo), raggiungi la cartella web
(per vedere in che cartella sei, scrivi dir
, per entrare in una cartella che si chiama CARTELLA, scrivi cd CARTELLA
)
Una volta nella cartella web
, scrivi
python web_server.py
(Se non parte metti 3
dopo python
prova python3 web_server.py
Dovrebbero apparire le scritte
starting server...
running server...
Per spegnere il server, premi Control-C
. Lo spegne in malo modo ma va bene lo stesso:
CTraceback (most recent call last):
File "web_server.py", line 99, in <module>
run()
File "web_server.py", line 97, in run
httpd.serve_forever()
File "/usr/lib/python3.5/socketserver.py", line 232, in serve_forever
ready = selector.select(poll_interval)
File "/usr/lib/python3.5/selectors.py", line 376, in select
fd_event_list = self._poll.poll(timeout)
KeyboardInterrupt
Proviamo il server
Contenuti dinamici
Assicurati che il server sia in funzione. Una volta che è partito, nel browser prova ad andare all’indirizzo
http://localhost:8081/din/saluta
Nel browser dovrebbe apparire la scritta Hello world
Questo è un esempio di contenuto generato dinamicamente. In questo esempio, accederemo a tutti i contenuti dinamici con indirizzi che contengono /dir/
Contenuti statici
Proviamo ad accedere al file _static/esempio.txt
Nel browser, vai all’indirizzo http://localhost:8081/esempio.txt
Il server dovrebbe cercare il file _static/esempio.txt
, leggerlo e mandarlo al browser. Nel browser dovrebbe apparire il contenuto del file d’esempio, cioè:
Abracadabra
Struttura del codice
Nel file web_server.py
, ci sono due funzioni, get_dinamico(self)
e get_statico(self)
. Probabilmente dovrai lavorare solo su get_dinamico(self)
Come parsare il path per estrarre parametri
Abbiamo visto come generare contenuti dinamici in base al path passato nel browser. Però se vogliamo implementare una ricerca, come /din/ricerca
dovremo passare dei parametri come il testo e eventualmente il valore di altri filtri. Come facciamo? Lascio qua sotto un’idea di come fare il cosiddetto parsing dei parametri.
# se self.path = '/saluta?param1=hello¶m2=mondo'
# questo codice va all'inizio della do_GET
from urllib.parse import urlparse
query = urlparse(self.path).query
query_components = dict(qc.split("=") for qc in query.split("&"))
# param1 = query_components["param1"]
# query_components = { "param1" : "Hello",
"param2" : "mondo" }
# print(param1) # Hello
[2]:
# scrivi qui
[ ]: