2010-01-22 32 views
25

httplib (nay là http.client) và tất cả bạn bè đều có conn.getresponse() và một lớp HTTPResponse, nhưng các hoạt động phía máy chủ của conn.getrequest() và một lớp HTTPRequest dường như thiếu.Python có mô-đun để phân tích các yêu cầu và phản hồi HTTP không?

Tôi hiểu rằng BaseHTTPServer và BaseHTTPRequestHandler có thể thực hiện chức năng này, nhưng chúng không hiển thị các phương pháp này để sử dụng bên ngoài mô-đun.

Về cơ bản những gì tôi muốn là BaseHTTPRequestHandler # parse_request là một phương thức tĩnh trả về một đối tượng HTTPRequest thay vì nhập các biến thành viên.

Trả lời

2

Để xử lý phía máy chủ, bạn muốn xem một cái gì đó như wsgiref.

Tiêu chuẩn WSGI phân tích cú pháp yêu cầu thành một từ điển đơn giản với tất cả các phần tử và phần tử liên quan.

2

Có thể bạn sẽ tìm thấy WebOb hữu ích. Các khung như giá treo, Turbogears và Bfg sử dụng nó như một phần của api của chúng. Nó hoạt động theo giả định rằng bạn đang làm việc theo WSGI.

43

Jeff, để cho phép phân tích để tôi tạo một chín-line nhỏ lớp con của trình xử lý cơ sở yêu cầu 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 

Bây giờ bạn có thể mất một chuỗi với nội dung của một yêu cầu HTTP trong và phân tích nó bằng instantiating lớp này:

# 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

này kết hợp với http://stackoverflow.com/questions/5975952/how-to-extract-http-message-body-in-basehttprequesthandler-do-post là tiện dụng cho phân tích của riêng bạn HttpRequest . – Joe

Các vấn đề liên quan