28 votes

Python dispose-t-il d'un module pour analyser les requêtes et les réponses HTTP ?

Httplib (maintenant http.client) et ses amis disposent tous de conn.getresponse() et d'une classe HTTPResponse, mais les opérations côté serveur de conn.getrequest() et d'une classe HTTPRequest semblent faire défaut.

Je comprends que BaseHTTPServer et BaseHTTPRequestHandler peuvent exécuter cette fonctionnalité, mais ils n'exposent pas ces méthodes pour une utilisation en dehors du module.

Ce que je veux essentiellement, c'est que BaseHTTPRequestHandler#parse_request soit une méthode statique qui renvoie un objet HTTPRequest plutôt que de remplir des variables membres.

47voto

Brandon Rhodes Points 21188

Jeff, pour permettre l'analyse, je crée une petite sous-classe de neuf lignes du gestionnaire de requête HTTP de base :

from BaseHTTPServer import BaseHTTPRequestHandler
from StringIO import StringIO

class HTTPRequest(BaseHTTPRequestHandler):
    def __init__(self, request_text):
        self.rfile = StringIO(request_text)
        self.raw_requestline = self.rfile.readline()
        self.error_code = self.error_message = None
        self.parse_request()

    def send_error(self, code, message):
        self.error_code = code
        self.error_message = message

Vous pouvez maintenant prendre une chaîne contenant le texte d'une requête HTTP et l'analyser en instanciant cette classe :

# Simply instantiate this class with the request text

request = HTTPRequest(request_text)

print request.error_code       # None  (check this first)
print request.command          # "GET"
print request.path             # "/who/ken/trust.html"
print request.request_version  # "HTTP/1.1"
print len(request.headers)     # 3
print request.headers.keys()   # ['accept-charset', 'host', 'accept']
print request.headers['host']  # "cm.bell-labs.com"

# Parsing can result in an error code and message

request = HTTPRequest('GET\r\nHeader: Value\r\n\r\n')

print request.error_code     # 400
print request.error_message  # "Bad request syntax ('GET')"

2voto

S.Lott Points 207588

Pour le traitement côté serveur, il faut envisager quelque chose comme wsgiref .

La norme WSGI analyse la demande en un simple dictionnaire contenant tous les en-têtes et éléments pertinents.

2voto

Tom Willis Points 3506

Vous trouverez probablement WebOb utile. Des frameworks comme Pylons, Turbogears et Bfg l'utilisent comme partie intégrante de leur api. Il fonctionne cependant en supposant que vous travaillez sous WSGI.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X