Server Http integrato e motore interno
CherryPy viene fornito con il proprio server web (HTTP). Questo è il motivo per cui CherryPy è autonomo e consente agli utenti di eseguire un'applicazione CherryPy entro pochi minuti dall'ottenimento della libreria.
Il web server funge da gateway per l'applicazione con l'aiuto del quale vengono tenute traccia di tutte le richieste e le risposte.
Per avviare il server web, un utente deve effettuare la seguente chiamata:
cherryPy.server.quickstart()
Il internal engine of CherryPy è responsabile delle seguenti attività:
- Creazione e gestione di oggetti di richiesta e risposta.
- Controllo e gestione del processo CherryPy.
CherryPy - Configurazione
Il framework viene fornito con un proprio sistema di configurazione che consente di parametrizzare il server HTTP. Le impostazioni per la configurazione possono essere memorizzate o in un file di testo con sintassi simile al formato INI o come un dizionario Python completo.
Per configurare l'istanza del server CherryPy, lo sviluppatore deve utilizzare la sezione globale delle impostazioni.
global_conf = {
'global': {
'server.socket_host': 'localhost',
'server.socket_port': 8080,
},
}
application_conf = {
'/style.css': {
'tools.staticfile.on': True,
'tools.staticfile.filename': os.path.join(_curdir, 'style.css'),
}
}
This could be represented in a file like this:
[global]
server.socket_host = "localhost"
server.socket_port = 8080
[/style.css]
tools.staticfile.on = True
tools.staticfile.filename = "/full/path/to.style.css"
Conformità HTTP
CherryPy si è evoluta lentamente ma include la compilazione di specifiche HTTP con il supporto di HTTP / 1.0, successivamente trasferite con il supporto di HTTP / 1.1.
CherryPy si dice che sia condizionatamente conforme a HTTP / 1.1 poiché implementa tutti i livelli obbligatori e obbligatori ma non tutti i livelli obbligatori della specifica. Pertanto, CherryPy supporta le seguenti funzionalità di HTTP / 1.1:
Se un client dichiara di supportare HTTP / 1.1, deve inviare un campo di intestazione in qualsiasi richiesta effettuata con la versione del protocollo specificata. Se non viene fatto, CherryPy interromperà immediatamente l'elaborazione della richiesta.
CherryPy genera un campo di intestazione Data che viene utilizzato in tutte le configurazioni.
CherryPy può gestire il codice di stato della risposta (100) con il supporto dei client.
Il server HTTP integrato di CherryPy supporta le connessioni persistenti che sono predefinite in HTTP / 1.1, tramite l'uso dell'intestazione Connection: Keep-Alive.
CherryPy gestisce correttamente le richieste e le risposte suddivise in blocchi.
CherryPy supporta le richieste in due modi distinti: le intestazioni If-Modified-Since e If-Unmodified-Since e invia le risposte secondo le richieste di conseguenza.
CherryPy consente qualsiasi metodo HTTP.
CherryPy gestisce le combinazioni di versioni HTTP tra il client e l'impostazione impostata per il server.
Server applicazioni multithread
CherryPy è progettato sulla base del concetto di multithreading. Ogni volta che uno sviluppatore ottiene o imposta un valore nello spazio dei nomi CherryPy, viene eseguito nell'ambiente multi-thread.
Sia cherrypy.request che cherrypy.response sono contenitori di dati di thread, il che implica che l'applicazione li chiama in modo indipendente sapendo quale richiesta viene trasmessa tramite proxy in fase di esecuzione.
I server delle applicazioni che utilizzano il modello threaded non sono molto apprezzati perché l'uso di thread è visto come un aumento della probabilità di problemi a causa dei requisiti di sincronizzazione.
Le altre alternative includono:
Pattern multiprocesso
Ogni richiesta viene gestita dal proprio processo Python. In questo caso, le prestazioni e la stabilità del server possono essere considerate migliori.
Modello asincrono
Qui, l'accettazione di nuove connessioni e la restituzione dei dati al client viene eseguita in modo asincrono dal processo di richiesta. Questa tecnica è nota per la sua efficienza.
Invio di URL
La comunità di CherryPy vuole essere più flessibile e che altre soluzioni per gli spedizionieri sarebbero apprezzate. CherryPy 3 fornisce altri dispatcher integrati e offre un modo semplice per scrivere e utilizzare i propri dispatcher.
- Applicazioni utilizzate per sviluppare metodi HTTP. (GET, POST, PUT, ecc.)
- Quello che definisce le rotte nell'URL - Routes Dispatcher
HTTP Method Dispatcher
In alcune applicazioni, gli URI sono indipendenti dall'azione, che deve essere eseguita dal server sulla risorsa.
Per esempio,http://xyz.com/album/delete/10
L'URI contiene l'operazione che il client desidera eseguire.
Per impostazione predefinita, il dispatcher di CherryPy viene mappato nel modo seguente:
album.delete(12)
Il suddetto dispatcher è menzionato correttamente, ma può essere reso indipendente nel modo seguente:
http://xyz.com/album/10
L'utente potrebbe chiedersi come il server invia la pagina esatta. Queste informazioni vengono trasportate dalla richiesta HTTP stessa. Quando c'è una richiesta dal client al server, CherryPy sembra il miglior gestore adatto, il gestore è la rappresentazione della risorsa targetizzata dall'URI.
DELETE /album/12 HTTP/1.1
Dispatcher delle rotte
Di seguito è riportato un elenco dei parametri per il metodo richiesto per l'invio:
Il parametro name è il nome univoco della route da connettere.
La rotta è il modello per abbinare gli URI.
Il controller è l'istanza che contiene i gestori di pagine.
L'utilizzo del dispatcher di Routes collega un modello che corrisponde agli URI e associa un gestore di pagina specifico.
Esempio
Facciamo un esempio per capire come funziona:
import random
import string
import cherrypy
class StringMaker(object):
@cherrypy.expose
def index(self):
return "Hello! How are you?"
@cherrypy.expose
def generate(self, length=9):
return ''.join(random.sample(string.hexdigits, int(length)))
if __name__ == '__main__':
cherrypy.quickstart(StringMaker ())
Seguire i passaggi indicati di seguito per ottenere l'output del codice sopra -
Step 1 - Salva il file sopra menzionato come tutRoutes.py.
Step 2 - Visita il seguente URL -
http://localhost:8080/generate?length=10
Step 3 - Riceverai il seguente output -