Python URLLib / URLLib2 POST
Asked Answered
A

1

39

I'm trying to create a super-simplistic Virtual In / Out Board using wx/Python. I've got the following code in place for one of my requests to the server where I'll be storing the data:

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

Nothing special going on there. The problem I'm having is that, based on how I read the docs, this should perform a Post Request because I've provided the data parameter and that's not happening. I have this code in the index for that url:

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

And every time I run my Python App I get the 'No action specified' text printed to my console. I'm going to try to implement it using the Request Objects as I've seen a few demos that include those, but I'm wondering if anyone can help me explain why I don't get a Post Request with this code. Thanks!

-- EDITED --

This code does work and Posts to my web page properly:

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()

I am still unsure why the urllib2 library doesn't Post when I provide the data parameter - to me the docs indicate that it should.

Athapaskan answered 13/7, 2010 at 15:53 Comment(2)
Why aren't you using urllib2?Latton
I am. urllib2.urlopen. I'm only using urllib to encode the post data.Athapaskan
T
47
u = urllib2.urlopen('http://myserver/inout-tracker', data)
h.request('POST', '/inout-tracker/index.php', data, headers)

Using the path /inout-tracker without a trailing / doesn't fetch index.php. Instead the server will issue a 302 redirect to the version with the trailing /.

Doing a 302 will typically cause clients to convert a POST to a GET request.

Tavis answered 13/7, 2010 at 16:29 Comment(1)
This answer was perfect! The Python 2.6 urllib2 module does switch from POST to GET on the redirect. This happens not only with a trailing forward slash, but can also happen for cases when http is redirected to https.Goodnight

© 2022 - 2024 — McMap. All rights reserved.