webdevqa.jp.net

Python URLLib / URLLib2 POST

Wx/Pythonを使用して、非常に単純な仮想入出力ボードを作成しようとしています。データを保存するサーバーへのリクエストの1つに対して、次のコードを用意しました。

data = urllib.urlencode({'q': 'Status'})
u = urllib2.urlopen('http://myserver/inout-tracker', data)
for line in u.readlines():
  print line

特別なことは何もありません。私が抱えている問題は、ドキュメントの読み方に基づいて、データパラメータを提供したので、これがポストリクエストを実行する必要があることです。私はそのURLのインデックスにこのコードを持っています:

if (!isset($_POST['q'])) { die ('No action specified'); }
echo $_POST['q'];

そして、Pythonアプリを実行するたびに、「アクションが指定されていません」というテキストがコンソールに出力されます。これまで見てきたように、Request Objectを使用して実装を試みます。これらを含むいくつかのデモがありますが、このコードで投稿リクエストを取得できない理由を説明できる人がいるかどうか疑問に思っています。

-編集済み-

このコードは機能し、Webページに適切に投稿します。

data = urllib.urlencode({'q': 'Status'})
h = httplib.HTTPConnection('myserver:8080')
headers = {"Content-type": "application/x-www-form-urlencoded", 
           "Accept": "text/plain"}
h.request('POST', '/inout-tracker/index.php', data, headers)
r = h.getresponse()
print r.read()

データパラメータを指定したときにurllib2ライブラリが投稿しない理由はまだわかりません。

36
g.d.d.c
u = urllib2.urlopen('http://myserver/inout-tracker', data)
h.request('POST', '/inout-tracker/index.php', data, headers)

末尾の/inout-trackerなしでパス/を使用しても、index.phpは取得されません。代わりに、サーバーは302を発行して、末尾に/を付けたバージョンにリダイレクトします。

通常、302を実行すると、クライアントはPOSTをGETリクエストに変換します。

46
bobince