CherryPy WSGI server
difficile
Proseguendo con l`esempio della pagina precedente ho scelto di interfacciarmi con il web server incluso nel framework CherryPy.
Questo web server ha delle performance molto interessanti ed è molto semplice da integrare. Ecco come (mi riferisco alla versione 3):
from cherrypy.wsgiserver import CherryPyWSGIServer
server = CherryPyWSGIServer(("0.0.0.0",8080),webinterface)
server.start()
Nel precedente esempio, dopo aver importato la classe CherryPyWSGIServer dal package cherrypy.wsgiserver, ho creato un oggetto server dando in input una tupla con url e porta http (in questo caso 8080) e il reference alla mia applicazione wsgi.
Poi ho avviato il server con il metodo start. Il processo si fermerà sul metodo start finchè non verrà terminato il server.
Per fermare il server basterà chiamare (da un altro thread) il metodo stop. Questo terminerà tutti i thread del server in modo "aggrazziato". Per fare un test è possibile terminare il server in risposta alla pressione di ctrl-c in questo modo:
try: server.start() except KeyboardInterrupt: server.stop(
In questo modo tutte le chiamate al nostro web server vengono gestite dall'applicazione webinterface.
E' possibile mappare le applicazioni wsgi da utilizzare in base agli url utilizzando l'oggetto WSGIPathInfoDispatcher:
from cherrypy.wsgiserver import CherryPyWSGIServer, WSGIPathInfoDispatcher
apps = WSGIPathInfoDispatcher({'/': webinterface,
'/app2': app2,
'/app3':app3})
server = CherryPyWSGIServer(("0.0.0.0",8080),apps)
server.start()
WSGIPathInfoDispatcher prende in input un semplice dizionario e in base alla corrispondenza della chiave con l'URL richiama diverse applicazioni.
In questo caso all`url / verrà richiamata la funzione webinterface mentre agli url /app2 e /app3 verranno richiamate rispettivamente le funzioni app2 e app3.
Risorse statiche
In tutto questo processo manca il modo di reperire delle risorse statiche (pagine html, css, immagini ecc.). Per ottenere questo ho utilizzato un'applicazione wsgi specializzata in questo compito. Si trova sul cheese shop e si ma è possibile scaricarla da qui.
Ho quindi modificato la mia applicazione così:
from static import Cling
path="/mystaticpath"
static_res = Cling(path)
apps = WSGIPathInfoDispatcher({'/': webinterface,
'/app2': app2,
'/app3':app3,
'/static':static_res})
server = CherryPyWSGIServer(("0.0.0.0",8080),apps)
server.start()In questo modo le risorse statiche che si trovano in locale nella directory /mystaticpath verranno rese disponibili all`url /static. Ad esempio, volendo usare un foglio di stile dovrei metterlo sotto /mystaticpath/default.css e farlo richiamare all`url /static/default.css.
