2010-01-22 9 views
25

httplib (teraz http.client) i wszyscy przyjaciele mają conn.getresponse() i klasę HTTPResponse, ale wydaje się, że brakuje operacji po stronie serwera conn.getrequest() i klasy HTTPRequest.Czy Python ma moduł do analizowania żądań HTTP i odpowiedzi?

Rozumiem, że funkcje BaseHTTPServer i BaseHTTPRequestHandler mogą wykonywać tę funkcję, ale nie udostępniają tych metod do użycia poza modułem.

Zasadniczo potrzebuję BaseHTTPRequestHandler # parse_request, aby być statyczną metodą, która zwraca obiekt HTTPRequest zamiast zapełniających zmiennych członków.

Odpowiedz

2

Do przetwarzania po stronie serwera chcesz spojrzeć na coś takiego jak wsgiref.

Standard WSGI analizuje żądanie w prostym słowniku ze wszystkimi odpowiednimi nagłówkami i elementami.

2

Pewnie przydałby się WebOb. Ramy takie jak Pylony, Turbogears i Bfg używają go jako części swojego interfejsu API. Działa to przy założeniu, że pracujesz w WSGI.

43

Jeff, w celu umożliwienia analizowania utworzyć małą dziewięciu linii podklasę obsługi żądań HTTP 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 

Możesz teraz podjąć ciąg z treścią żądania HTTP wewnątrz i analizować je przez instancji ta klasa:

# 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

to w połączeniu z http://stackoverflow.com/questions/5975952/how-to-extract-http-message-body-in-basehttprequesthandler-do-post jest przydatny do analizowania własnego HTTPRequest . – Joe

Powiązane problemy