28 Stimmen

Hat Python ein Modul zum Analysieren von HTTP-Anfragen und -Antworten?

Httplib (jetzt http.client) und Freunde haben alle conn.getresponse() und eine HTTPResponse-Klasse, aber die serverseitigen Operationen von conn.getrequest() und einer HTTPRequest-Klasse scheinen zu fehlen.

Ich verstehe, dass BaseHTTPServer und BaseHTTPRequestHandler diese Funktionalität ausführen können, aber sie geben diese Methoden nicht zur Verwendung außerhalb des Moduls frei.

Im Wesentlichen möchte ich, dass BaseHTTPRequestHandler#parse_request eine statische Methode ist, die ein HTTPRequest-Objekt zurückgibt, anstatt Member-Variablen zu befüllen.

47voto

Brandon Rhodes Punkte 75647

Jeff, um die Analyse zu aktivieren, habe ich eine kleine neunzeilige Unterklasse des Basis-HTTP-Anforderungshandlers erstellt:

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

Jetzt können Sie einen String mit dem Text einer HTTP-Anforderung im Inneren nehmen und ihn analysieren, indem Sie diese Klasse instanziieren:

# Einfach diese Klasse mit dem Anforderungstext instanziieren

request = HTTPRequest(request_text)

print request.error_code       # None  (überprüfen Sie dies zuerst)
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"

# Die Analyse kann zu einem Fehlercode und einer Meldung führen

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 Punkte 371691

Für die serverseitige Verarbeitung möchten Sie sich etwas wie wsgiref ansehen.

Der WSGI-Standard zerlegt die Anfrage in ein einfaches Wörterbuch mit allen relevanten Headern und Elementen.

2voto

Tom Willis Punkte 5186

Sie würden wahrscheinlich WebOb nützlich finden. Frameworks wie Pylons, Turbogears und Bfg verwenden es als Teil ihrer API. Es arbeitet jedoch unter der Annahme, dass Sie unter WSGI arbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X