6

私は Python (v3.3 を使用) と Web プログラミングの初心者で、一晩中問題に苦しんでいます。サーバーに POST 呼び出しを発行し、次のようにデータを送信しています。

DATA = {"listName":"Test list","listDesc":"A test list with test stuff in it.","refreshMode":"Replace","DBKey":"1","UserDisplaySeq":"1"}
DATA = json.dumps(DATA)
METHOD = "POST"
DATA = DATA.encode("utf-8")
params = "account_id=acct 2"
try:
    URL = "http://localhost:8080/lists?" + quote_plus(params)
    request = urllib.request.Request(url=URL,data=DATA,method=METHOD)
    response = urllib.request.urlopen(request)
...

また、次のようにコーディングされたリクエスト ハンドラーもあります (ここには、デバッグ目的で多くの print ステートメントがあります)。

class MyHandler(BaseHTTPRequestHandler):
...
def do_POST(self):
    length = int(self.headers['Content-Length'])
    print("HEADERS: ", self.headers)
    print (str(length))
    print(self.rfile)
    post_data = urllib.parse.parse_qs(self.rfile.read(length).decode('utf-8'))
    print(post_data)

これにより、次の結果がコンソールに出力されます。

Starting thread
started httpserver...
HEADERS:  Accept-Encoding: identity
User-Agent: Python-urllib/3.3
Content-Length: 138
Content-Type: application/x-www-form-urlencoded
Host: localhost:8080
Connection: close


138
<_io.BufferedReader name=404>
{}

私の質問:
1)サーバー(do_POST)で、リクエストで送信していると思われるデータにアクセスするにはどうすればよいですか(つまり、{"listName":"Test list","listDesc":"A test...) ?

2)そもそも私のリクエストはデータを送信していますか?

3) 初心者がアクセスできる用語でこれが文書化されている場所はありますか?

4

2 に答える 2

9

これを試してみてください。別の質問への回答から盗みました

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 = {}

    print(postvars.get("listName", "didn't find it"))
于 2013-07-17T03:37:26.733 に答える