Web development

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&param2=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
Mostra soluzione
[2]:
# scrivi qui


[ ]: