11.16 BaseHTTPServer -- Server HTTP di base

Questo modulo definisce due classi per implementare server HTTP (server Web). Solitamente, questo modulo non viene utilizzato direttamente, ma viene utilizzato come base per costruire server Web funzionanti. Vedere i moduli SimpleHTTPServer e CGIHTTPServer.

La prima classe, HTTPServer, è una sotto classe SocketServer.TCPServer. Crea ed ascolta su un socket HTTP, trasferendo la richiesta ad un gestore. Il codice per creare ed eseguire il server somiglia a questo:

def run(server_class=BaseHTTPServer.HTTPServer,
        handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()

class HTTPServer( server_address, RequestHandlerClass)
Questa classe costruisce sulla classe TCPServer memorizzando l'indirizzo del server come variabile di istanza chiamata server_name e server_port. Il server è accessibile attraverso il gestore, tipicamente attraverso la variabile server dell'istanza del gestore.

class BaseHTTPRequestHandler( request, client_address, server)
Questa classe viene usata per gestire le richieste HTTP che arrivano al server. Da solo, non è in grado di rispondere a nessuna richiesta HTTP; deve essere derivato in una sotto classe per gestire ogni metodo di richiesta (GET o POST). BaseHTTPRequestHandler fornisce numerose classi, variabili d'istanza e metodi per l'uso attraverso le sotto classi.

Il gestore analizzerà la richiesta e le intestazioni, quindi chiamerà un metodo specifico per il tipo di richiesta. Il nome del metodo viene costruito in base alla richiesta. Per esempio, per la richiesta con metodo "SPAM", il metodo do_SPAM() verrà chiamato senza alcun argomento. Tutte le informazioni rilevanti vengono memorizzate in variabili d'istanza del gestore. Le sotto classi non devono necessariamente sovrascrivere o estendere il metodo __init__().

BaseHTTPRequestHandler ha le seguenti variabili d'istanza:

client_address
Contiene una tupla nella forma (host, porta) che si riferisce all'indirizzo del client.

command
Contiene il comando (tipo di richiesta). Per esempio 'GET'.

path
Contiene il percorso richiesto.

request_version
Contiene la stringa della versione nella richiesta. Per esempio, 'HTTP/1.0'.

headers
Mantiene le istanze della classe specificata dalla variabile di classe MessageClass. L'istanza analizza e gestisce le intestazioni della richiesta HTTP.

rfile
Contiene uno flusso dell'input, posizionato all'inizio di eventuali dati in input.

wfile
Contiene il flusso dell'output per rispondere ad una richiesta del client. Occorre mantenersi aderenti al protocollo HTTP quando si scrive in questo flusso.

BaseHTTPRequestHandler possiede le seguenti variabili di classe:

server_version
Specifica la versione del software del server. Questa variabile si può sovrascrivere. Il formato è una stringa separata da spazi multipli, dove ogni stringa è nella forma nome[/versione]. Per esempio, 'BaseHTTP/0.2'.

sys_version
Contiene la versione del sistema Python in una forma usabile attraverso il metodo version_string e la variabile di classe server_version. Per esempio, 'Python/1.4'.

error_message_format
Specifica una stringa di formato per costruire un errore di risposta al client. Utilizza specificatori di formato immodificabili e racchiusi tra parentesi, cosicché l'operando di formato dovrà essere un dizionario. La chiave di code dovrebbe essere un intero che specifica il valore del codice numerico di errore HTTP. message dovrebbe essere una stringa contenente un (dettagliato) messaggio di errore di ciò che è accaduto e explain dovrebbe essere una spiegazione del numero attribuito al codice di errore. Il messaggio message predefinito e le spiegazioni explain possono essere rinvenuti nelle variabili di classe delle risposte responses.

protocol_version
Questa è la specifica versione del protocollo HTTP utilizzato nelle risposte. Se impostato a 'HTTP/1.1', il server consentirà connessioni persistenti; il server deve comunque includere un'accurata intestazione Content-Length (utilizzando send_header()) in tutte le sue risposte ai client. Per retrocompatibilità, l'impostazione predefinita è 'HTTP/1.0'.

MessageClass
Specifica una classe corrispondente all'rfc822.Message per analizzare le intestazioni HTTP. Tipicamente, questa non viene sovrascritta ed il suo valore predefinito è mimetools.Message.

responses
Questa variabile contiene una mappa tra gli interi dei codici di errori e una serie di tuple di due elementi contenenti un breve e un lungo messaggio. Per esempio, {code: (shortmessage, longmessage)}. Il messaggio breve viene usato di solito per la chiave del messaggio in una risposta di errore, e il messaggio lungo come la chiave di spiegazione (vedere la variabile di classe error_message_format).

Un'istanza BaseHTTPRequestHandler possiede i seguenti metodi:

handle( )
Chiama una volta handle_one_request() (o, se la connessione persistente è abilitata, più volte) per gestire le richieste HTTP in arrivo. Non ci sono motivi per sovrascrivere questo metodo; al suo posto si possono implementare i più appropriati metodi do_*().

handle_one_request( )
Questo metodo analizza e invia la richiesta all'appropriato metodo do_*(). Non si deve sovrascrivere questo metodo.

send_error( code[, message])
Invia e registra come log una risposta completa di errore al client. Il codice numerico code indica il codice di errore HTTP, con message facoltativo, contenente testo maggiormente specifico. Un insieme completo di intestazioni viene inviato seguito dal testo composto usando la variabile di classe error_message_format.

send_response( code[, message])
Invia un'instestazione di risposta e registra come log le richieste accettate. La riga HTTP di risposta viene inviata, seguita dalle intestazioni Server e Date. Il valore per queste due intestazioni viene prelevato rispettivamente dai metodi version_string() e date_time_string().

send_header( keyword, value)
Scrive un'intestazione HTTP specifica sul flusso di uscita. keyword dovrebbe specificare la chiave dell'intestazione, con value che specifica il valore.

end_headers( )
Invia una riga vuota, che indica la fine delle intestazioni HTTP nella risposta.

log_request( [code[, size]])
Registra come log ed accetta (con successo) la richiesta. code dovrebbe specificare il codice HTTP numerico associato alla risposta. Se la dimensione della riposta è disponibile, dovrebbe venir passata come parametro size.

log_error( ...)
Registra come log un errore quando una richiesta non può essere pienamente soddisfatta. Il suo comportamento predefinito è passare il messaggio a log_message(), in modo da acquisire gli stessi argomenti (format ed ulteriori valori).

log_message( format, ...)
Registra come log un messaggio arbitrario sul sys.stderr. Questo metodo viene tipicamente sovrascritto per creare meccanismi di logging di errori personalizzati. L'argomento format è una stringa di formato standard in stile printf, dove gli argomenti addizioniali per log_message() vengono applicati come input nella formattazione. L'indirizzo del client, data ed ora correnti vengono inseriti all'inizio di ogni messaggio registrato nei log.

version_string( )
Restituisce la stringa con la versione del software del server. Questa è una combinazione delle variabili di classe server_version e sys_version.

date_time_string( )
Restituisce la data e l'ora corrente, formattata per l'intestazione di un messaggio.

log_data_time_string( )
Restituisce la data e l'ora corrente, formattata per il logging.

address_string( )
Restituisce l'indirizzo del client, formattato per il logging. Una ricerca del nome viene eseguita sull'indirizzo IP del client.

Vedete anche:

Modulo CGIHTTPServer:
Gestore di richieste esteso, che supporta gli scripts CGI.

Modulo SimpleHTTPServer:
Gestore di richieste di base che limita le risposte ai file attuamente nella directory principale.
Vedete Circa questo documento... per informazioni su modifiche e suggerimenti.