Python URLLib / URLLib2 POST

39

我正在尝试使用wx/Python创建一个超级简单的虚拟进出板。 我已经为向服务器发送请求并存储数据的其中一种请求放置了以下代码:

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

那里没有什么特别的。我遇到的问题是,根据我阅读的文档,这应该执行一个Post请求,因为我提供了数据参数,但实际情况并非如此。我在该url的索引中有以下代码:

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

每次运行我的Python应用程序时,我都会在控制台上打印出“未指定动作”的文本。我将尝试使用请求对象来实现它,因为我看过一些包括这些对象的演示,但我想知道为什么我使用这段代码没有收到Post请求。谢谢!

-- 编辑 --

这段代码确实有效,并成功地发布到了我的网页:

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库在提供数据参数时不会进行POST操作 - 对我来说,文档表明它应该这样做。


你为什么不使用urllib2 - S.Lott
4
我使用 urllib2.urlopen。我只是使用 urllib 来编码 post 数据。 - g.d.d.c
1个回答

47
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请求。


7
这个回答非常完美!Python 2.6 的 urllib2 模块确实会在重定向时从 POST 切换到 GET 方法。这不仅发生在以斜杠结尾的情况下,还可能发生在 HTTP 被重定向到 HTTPS 的情况下。 - Hazok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接