Python URLLib / URLLib2 POST

116,433
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.

Share:
116,433
g.d.d.c
Author by

g.d.d.c

Programming: An industry where you have to design your own tools before you can use them, and other people can redesign them for you after you've put them into use. If it's worth doing twice, it's worth writing a script.

Updated on May 25, 2020

Comments

  • g.d.d.c
    g.d.d.c almost 4 years

    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.

  • Hazok
    Hazok over 10 years
    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.