11.14 BaseHTTPServer --- Serveur HTTP basique

Ce module définit deux classes pour implémenter des serveurs HTTP (serveurs web). En général, ce module n'est pas utilisé directement, mais sert de base pour contruire des serveurs HTTP opérationnels. Voir les modules SimpleHTTPServer et CGIHTTPServer.

La première classe, HTTPServer, est une sous-classe de SocketServer.TCPServer. Elle créée la socket web, écoute dessus, répartit les requêtes vers un gestionnaire. Le code pour créer et exécuter le serveur ressemble à ceci:

def run(classe_serveur=BaseHTTPServer.HTTPServer,
        classe_gestionnaire=BaseHTTPServer.BaseHTTPRequestHandler):
    adresse_serveur = ('', 8000)
    httpd = classe_serveur(adresse_serveur, classe_gestionnaire)
    httpd.serve_forever()

HTTPServer(adresse_serveur, ClasseGestionnaireDeRequete)
Cette classe s'appuie sur la classe TCPServer pour stocker l'adresse du serveur comme des variables d'instance appelées server_name et server_port. Le serveur est accessible par le gestionnaire, typiquement à travers la variable d'instance du gestionnaire server.

BaseHTTPRequestHandler(requete, adresse_client, serveur)
Cette classe sert à gérer les requêtes HTTP qui arrivent sur le serveur. Par elle-même, elle ne peut pas répondre à une requête HTTP; elle doit être dérivée pour traiter chacune des méthodes de requête (par exemple GET ou POST). BaseHTTPRequestHandler fournit un certain nombre de variables d'instance ou de classe, et des méthodes à utiliser par les sous-classes.

Le gestionnaire analysera la requête et les en-têtes, puis appellera une méthode propre au type de requête. Le nom de la méthode est construit d'après la requête. Par exemple, pour la méthode de requête "SPAM", la méthode do_SPAM() sera appelée, sans argument. Toute l'information pertinente est stockée dans des variables d'instance du gestionnaire. Les sous-classes ne devraient pas avoir besoin de surcharger ou d'étendre la méthode __init__().

BaseHTTPRequestHandler possède les variables d'instance suivantes:

client_address
Contient un tuple de la forme (hote, port) correspondant à l'adresse du client.

command
Contient la commande (type de requête). Par exemple, 'GET'.

path
Contient le chemin de requête.

request_version
Contient la chaîne indiquant la version telle qu'elle figure dans la requête. Par exemple, 'HTTP/1.0'.

headers
Contient une instance de la classe spécifiée par la variable de classe MessageClass. Cette instance analyse et gère les en-têtes dans la requête HTTP.

rfile
Contient un flux d'entrée, positionné au début des données d'entrée optionnelles.

wfile
Contient le flux de sortie servant à écrire la réponse à renvoyer au client. Il faut se conformer strictement au protocole HTTP quand on écrit dans ce flux.

BaseHTTPRequestHandler possède les variables de classe suivantes:

server_version
Spécifie la version du logiciel serveur. Il se peut que vous ayez envie de modifier cette variable. Le format est un ensemble de chaînes séparées par des espaces, où chaque chaîne est de la forme nom[/version]. Par exemple, 'BaseHTTP/0.2'.

sys_version
Contient la version de Python du système, dans une forme utilisable par la méthode version_string et par la variable de classe server_version. Par exemple, 'Python/1.4'.

error_message_format
Spécifie une chaîne de format pour contruire une réponse d'erreur au client. Comme elle utilise des spécificateurs de format avec parenthèses et clés, l'opérande doit être un dictionnaire. La clé code doit être un entier, spécifiant la valeur numérique du code d'erreur HTTP. message doit être une chaîne contenant un message d'erreur (détaillé) sur ce qui s'est passé, et explain doit être une explication du numéro de code d'erreur. Les valeurs par défaut de message et explain figurent dans la variable de classe responses.

protocol_version
Spécifie la version de protocole HTTP utilisée dans les réponses. Typiquement, ne devrait pas être modifiée. Par défaut, vaut 'HTTP/1.0'.

MessageClass
Spécifie une classe du genre rfc822.Message pour analyser les en-têtes HTTP. Typiquement, cette valeur n'est pas modifiée, et elle vaut par défaut mimetools.Message.

responses
Cette variable contient une table de correspondance entre les codes d'erreur entiers et des tuples à deux éléments contenant un message court et un long. Par exemple, {code: (messagecourt, messagelong)}. Le messagecourt est habituellement utilisé comme clé message dans un message d'erreur, et messagelong comme la clé explain (voir la variable de classe error_message_format).

Une instance de BaseHTTPRequestHandler possède les méthodes suivantes:

handle()
Surcharge la méthode handle() de la superclasse pour fournir le comportement spécifique du gestionnaire. Cette méthode analysera et orientera la requête vers la méthode do_*() appropriée.

send_error(code[, message])
Envoie et trace une réponse d'erreur complète au client. Le code numérique spécifie le code d'erreur HTTP, avec éventuellement message comme texte plus explicite. Un ensemble complet d'en-têtes est envoyé, suivi du texte composé en se servant de la variable de classe error_message_format.

send_response(code[, message])
Envoie une en-tête de réponse et trace la requête acceptée. La ligne de réponse HTTP est envoyée, suivie des en-têtes Server et Date. Les valeurs de ces deux en-têtes sont obtenues respectivement par les méthodes version_string() et date_time_string().

send_header(motcle, valeur)
Ecrit un en-tête MIME spécifique sur le flux de sortie. motcle doit spécifier le mot-clé de l'en-tête, et valeur indiquer sa valeur.

end_headers()
Envoie une ligne vide, indiquant la fin des en-têtes MIME dans la réponse.

log_request([code[, taille]])
Trace une requête acceptée (réussie). code doit spécifier le code HTTP numérique associé à la réponse. Si une taille de la réponse est disponible, elle doit être passée comme le paramètre taille.

log_error(...)
Trace une erreur quand une requête ne peut pas être servie. Par défaut, la méthode passe le message à log_message(), elle prend donc les mêmes arguments (format et les valeurs additionnelles).

log_message(format, ...)
Trace un message quelconque sur sys.stderr. Cette méthode est typiquement surchargée pour créer des mécanismes personnalisés de traçage d'erreurs. L'argument format est une chaîne de formattage standard du genre printf, et les arguments additionnels de log_message() sont appliqués comme données d'entrée pour le formattage. L'adresse du client et les date et heure courantes sont ajoutées au début de chaque message tracé.

version_string()
Retourne une chaîne avec la version logicielle du serveur. C'est une combinaison des variables de classe server_version et sys_version.

date_time_string()
Retourne les date et heure courantes, formattées pour un en-tête de message.

log_data_time_string()
Retourne les date et heure courantes, formattées pour traçage.

address_string()
Retourne l'adresse du client, formattée pour traçage. Une consultation de nom est effectuée sur l'adresse IP du client.

Voir aussi:

Module CGIHTTPServer:
Gestionnaire de requête étendu qui prend en charge les scripts CGI.

Module SimpleHTTPServer:
Gestionnaire de requêtes basique qui limite la réponse aux fichiers qui se trouvent sous la racine du document.