2010-11-20 27 views
39

最も単純なHTTPサーバーを指定した場合、BaseHTTPRequestHandlerでポスト変数を取得するにはどうすればよいですか?Python:BaseHTTPRequestHandler HTTP POSTハンドラからキーと値のペアを取得するにはどうすればよいですか?

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 

私は、単にparam1とparam2の値を取得することができます。ありがとう!

答えて

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

多分あなたはこの:)を参照してくださいよ、あなたが知っていますかpostvarsがハンドラクラスの外部で利用できるようにする方法はありますか? – KevinDTimm

+0

@KevinDTimm、これは...ああ、約1年後ですが、[静的メンバー](http://stackoverflow.com/a/3506218/344286)をハンドラクラスに追加すると、それにアクセスできますクラスにアクセスできるどこにでもあります。 –

+0

@WayneWerner - 私はこれを見ました(名前タグが大好き!)。ありがとう。 – KevinDTimm

27

私は投稿を編集しようとした拒否されてしまったので、Pythonの2.7と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() 
     ... 

    ... 
関連する問題