2010-11-20 1 views
39

dato il server HTTP più semplice, come faccio a ottenere variabili post in un BaseHTTPRequestHandler?Python: Come posso ottenere coppie chiave/valore dal gestore POST HTTP 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 

Vorrei semplicemente poter ottenere i valori di param1 e param2. Grazie!

risposta

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

forse vedrete questo :) Sai in qualche modo che i postvari siano disponibili al di fuori della classe del conduttore? – KevinDTimm

+0

@KevinDTimm, questo è ... oh, circa un anno dopo, ma se aggiungi un [membro statico] (http://stackoverflow.com/a/3506218/344286) alla classe del gestore, puoi accedervi ovunque che possa accedere alla classe. –

+0

@WayneWerner - L'ho visto (adoro le etichette del nome!). Grazie. – KevinDTimm

27

ho cercato di modificare il post, ma ho rifiutato, quindi non c'è la mia versione di questo codice che dovrebbe funzionare su Python 2.7 e 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() 
     ... 

    ...