2010-03-22 45 views
28

BaseHTTPHandler từ mô-đun BaseHTTPServer dường như không cung cấp bất kỳ cách thuận tiện nào để truy cập thông số yêu cầu http. Cách tốt nhất để phân tích cú pháp các tham số GET từ đường dẫn và tham số POST từ phần thân yêu cầu là gì?Phân tích http GET và POST tham số từ BaseHTTPHandler?

Ngay bây giờ, tôi đang sử dụng này cho GET:

def do_GET(self): 
    parsed_path = urlparse.urlparse(self.path) 
    try: 
     params = dict([p.split('=') for p in parsed_path[4].split('&')]) 
    except: 
     params = {} 

này hoạt động cho hầu hết các trường hợp, nhưng tôi muốn một cái gì đó mạnh mẽ hơn để xử lý mã hóa và các trường hợp như các thông số có sản phẩm nào đúng. Lý tưởng nhất, tôi muốn một cái gì đó nhỏ và độc lập, chứ không phải là một khuôn khổ web đầy đủ.

Trả lời

5

Bạn có thể thử các mô-đun Werkzeug, thư viện Werkzeug cơ sở không quá lớn và nếu cần bạn chỉ cần trích xuất mã bit này và bạn đã hoàn tất.

Phương pháp url_decode trả về một MultiDict và hỗ trợ mã hóa :)

Trái ngược với phương pháp urlparse.parse_qs phiên bản Werkzeug chăm sóc:

  • mã hóa
  • nhiều giá trị
  • thứ tự sắp xếp

Nếu bạn không có n eed cho những (hoặc trong trường hợp mã hóa, sử dụng Python 3) hơn là cảm thấy tự do để sử dụng các giải pháp tích hợp.

2

Bạn đã điều tra bằng cách sử dụng thư viện như CherryPy? Họ cung cấp một con đường nhanh hơn để xử lý những thứ này hơn BaseHTTPServer.

2

Hỗ trợ thông số yêu cầu HTTP cơ bản được cung cấp trong CGI module. Cơ chế được đề nghị để xử lý dữ liệu biểu mẫu là lớp cgi.FieldStorage.

Để nhận dữ liệu biểu mẫu đã gửi, tốt nhất bạn nên sử dụng lớp FieldStorage. Các lớp khác được định nghĩa trong mô-đun này được cung cấp chủ yếu cho khả năng tương thích ngược. Khởi tạo nó chính xác một lần, không có đối số. Điều này đọc nội dung biểu mẫu từ đầu vào tiêu chuẩn hoặc môi trường (tùy thuộc vào giá trị của các biến môi trường khác nhau được đặt theo tiêu chuẩn CGI). Vì nó có thể tiêu thụ đầu vào tiêu chuẩn, nó sẽ được khởi tạo chỉ một lần.

Ví dụ FieldStorage có thể được lập chỉ mục như từ điển Python. Nó cho phép kiểm tra thành viên với toán tử in và cũng hỗ trợ phương thức từ điển chuẩn keys() và hàm tích hợp len(). Các trường biểu mẫu có chứa các chuỗi rỗng sẽ bị bỏ qua và không xuất hiện trong từ điển; để giữ các giá trị như vậy, hãy cung cấp giá trị thực cho tham số từ khóa keep_blank_values ​​tùy chọn khi tạo cá thể FieldStorage.

Ví dụ, đoạn mã sau (mà giả định rằng các tiêu đề Content-Type và dòng trống đã được in) kiểm tra rằng tên các lĩnh vực và các địa chỉ đều thiết lập để một chuỗi không rỗng:

form = cgi.FieldStorage() 
if "name" not in form or "addr" not in form: 
    print "<H1>Error</H1>" 
    print "Please fill in the name and addr fields." 
    return 
print "<p>name:", form["name"].value 
print "<p>addr:", form["addr"].value 
#...further form processing here... 
+0

Thư viện CGI không xử lý mã hóa (như utf -8) cho bạn vì vậy nó ít phù hợp hơn so với một số thư viện khác có sẵn. – Wolph

+0

Việc mã hóa có thể được ủy quyền cho đối số 1 giống như tệp của FieldStorage. – gimel

+0

Đúng, nhưng tại sao phải bận tâm khi có các kịch bản xử lý việc này cho bạn bao gồm cả việc bắt lỗi? Không cần phải phát minh lại bánh xe. – Wolph

78

Bạn có thể muốn sử dụng url.parse:

>>> from url.parse import urlparse, parse_qs 
>>> url = 'http://example.com/?foo=bar&one=1' 
>>> parse_qs(urlparse(url).query) 
{'foo': ['bar'], 'one': ['1']} 

Đối Python 2, module được đặt tên urlparse thay vì url.parse. giải pháp

+2

Cần lưu ý rằng urlparse trong Python 2 không xử lý mã hóa, phiên bản Python 3 hỗ trợ điều đó. Ngoài ra, để duy trì thứ tự đúng 'parse_qsl' nên được sử dụng thay vì' parse_qs' trả về một danh sách. – Wolph

8

Tốt hơn để một câu hỏi cũ:

def do_POST(self): 
    length = int(self.headers.getheader('content-length')) 
    field_data = self.rfile.read(length) 
    fields = urlparse.parse_qs(field_data) 

này sẽ kéo dữ liệu POST urlencoded từ nội dung tài liệu và phân tích nó một dict với urldecoding thích

+0

Tôi đã cố gắng tạo ra máy chủ cơ bản nhất có thể xử lý các yêu cầu nhận và gửi bằng Python, và chỉ máy chủ của bạn làm việc cho tôi trong việc xử lý các yêu cầu POST. Điều này đã được viết cách đây 3 năm, nhưng cảm ơn! :) – harkirat1892

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