2010-01-22 14 views
25

httplib (ora http.client) e tutti gli amici hanno conn.getresponse() e una classe HTTPResponse, ma le operazioni sul lato server di conn.getrequest() e una classe HTTPRequest sembrano mancare.Python ha un modulo per analizzare le richieste e le risposte HTTP?

Capisco che BaseHTTerver e BaseHTTPRequestHandler possono eseguire questa funzionalità, ma non espongono questi metodi per l'utilizzo al di fuori del modulo.

Essenzialmente quello che voglio è BaseHTTPRequestHandler # parse_request per essere un metodo statico che restituisce un oggetto HTTPRequest invece di compilare le variabili membro.

risposta

2

Per l'elaborazione sul lato server si desidera esaminare qualcosa come wsgiref.

Lo standard WSGI analizza la richiesta in un dizionario semplice con tutte le intestazioni e gli elementi rilevanti.

2

Probabilmente troverai utile WebOb. Strutture come Piloni, Turbogears e Bfg lo usano come parte della loro api. Funziona sempre supponendo che tu stia lavorando sotto WSGI.

43

Jeff, per consentire l'analisi creo un piccolo di nove-line sottoclasse del gestore di base richiesta HTTP:

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 

ora è possibile prendere una stringa con il testo di una richiesta HTTP dentro e analizzarlo istanziando questa 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')" 
+0

questo, combinato con http://stackoverflow.com/questions/5975952/how-to-extract-http-message-body-in-basehttprequesthandler-do-post è utile per analizzare il proprio HTTPRequest . – Joe

Problemi correlati