2010-11-20 32 views
39

được cung cấp cho máy chủ HTTP đơn giản nhất, làm cách nào để tôi nhận được các biến bài đăng trong một BaseHTTPRequestHandler?Python: Làm cách nào để nhận cặp khóa/giá trị từ trình xử lý HTTP POST của BaseHTTPRequestHandler?

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer 

class Handler(BaseHTTPRequestHandler): 
    def do_POST(self): 
     # post variables?! 

server = HTTPServer(('', 4444), Handler) 
server.serve_forever() 

# test with: 
# curl -d "param1=value1&param2=value2" http://localhost:4444 

Tôi chỉ muốn có thể nhận được các giá trị của param1 và param2. Cảm ơn!

Trả lời

53
def do_POST(self): 
    ctype, pdict = cgi.parse_header(self.headers.getheader('content-type')) 
    if ctype == 'multipart/form-data': 
     postvars = cgi.parse_multipart(self.rfile, pdict) 
    elif ctype == 'application/x-www-form-urlencoded': 
     length = int(self.headers.getheader('content-length')) 
     postvars = cgi.parse_qs(self.rfile.read(length), keep_blank_values=1) 
    else: 
     postvars = {} 
    ... 
+0

có thể bạn sẽ thấy điều này :) Bạn có biết của bất kỳ cách nào để postvars có sẵn bên ngoài lớp xử lý? – KevinDTimm

+0

@ KevinDTimm, đây là ... oh, khoảng một năm sau đó, nhưng nếu bạn thêm [thành viên tĩnh] (http://stackoverflow.com/a/3506218/344286) vào lớp trình xử lý, thì bạn có thể truy cập nó bất cứ nơi nào có thể truy cập vào lớp học. –

+0

@WayneWerner - Tôi đã thấy điều này (yêu các thẻ tên!). Cảm ơn. – KevinDTimm

27

Tôi cố gắng để chỉnh sửa bưu chính đã bị từ chối, vì vậy phiên bản của tôi về mã này nên hoạt động trên Python 2.7 và 3.2:

from sys import version as python_version 
from cgi import parse_header, parse_multipart 

if python_version.startswith('3'): 
    from urllib.parse import parse_qs 
    from http.server import BaseHTTPRequestHandler 
else: 
    from urlparse import parse_qs 
    from BaseHTTPServer import BaseHTTPRequestHandler 

class RequestHandler(BaseHTTPRequestHandler): 

    ... 

    def parse_POST(self): 
     ctype, pdict = parse_header(self.headers['content-type']) 
     if ctype == 'multipart/form-data': 
      postvars = parse_multipart(self.rfile, pdict) 
     elif ctype == 'application/x-www-form-urlencoded': 
      length = int(self.headers['content-length']) 
      postvars = parse_qs(
        self.rfile.read(length), 
        keep_blank_values=1) 
     else: 
      postvars = {} 
     return postvars 

    def do_POST(self): 
     postvars = self.parse_POST() 
     ... 

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