2010-07-13 17 views
30

Ich versuche, eine super-vereinfachte virtuelle In/Out-Board mit Wx/Python zu erstellen. Ich habe für eine meiner Anfragen an den Server den folgenden Code anstelle, wo ich die Daten werden zu speichern werden:Python URLLib/URLLib2 POST

data = urllib.urlencode({'q': 'Status'}) 

u = urllib2.urlopen('http://myserver/inout-tracker', data) 

for line in u.readlines(): 
    print line 

Nichts Besonderes los dort. Das Problem, das ich habe, ist, dass, basierend auf wie ich die Dokumente lese, sollte dies eine Post-Anfrage durchführen, weil ich den Datenparameter bereitgestellt haben, und das ist nicht passiert. Ich habe diesen Code in dem Index für diese URL:

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

echo $_POST['q']; 

Und jedes Mal, wenn ich meinen Python App ich den ‚keine Aktion angegeben‘ Text zu meiner Konsole gedruckt bekommen laufen. Ich werde versuchen, es mithilfe der Request Objects zu implementieren, da ich ein paar Demos gesehen habe, die diese enthalten, aber ich frage mich, ob mir jemand erklären kann, warum ich keine Post-Anfrage mit diesem Code erhalte. Vielen Dank!

- EDITED -

Dieser Code funktioniert und Beiträge auf meiner Web-Seite richtig:

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

Ich bin immer noch nicht sicher, warum die urllib2 Bibliothek Stellen nicht, wenn ich die Datenparameter liefern - zu mir zeigen die Dokumente an, dass es sollte.

+0

Warum verwenden Sie nicht 'urllib2'? –

+3

Ich bin. 'urllib2.urlopen'. Ich verwende nur urllib, um die Postdaten zu codieren. –

Antwort

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

den Pfad Mit /inout-tracker ohne Hinter / nicht index.php nicht holen. Stattdessen gibt der Server eine 302 Weiterleitung an die Version mit dem nachfolgenden / aus.

Das Ausführen einer 302 führt normalerweise dazu, dass Clients eine POST in eine GET-Anfrage konvertieren.

+7

Diese Antwort war perfekt! Das Python 2.6 urllib2-Modul wechselt auf der Weiterleitung von POST zu GET. Dies geschieht nicht nur mit einem abschließenden Schrägstrich, sondern kann auch für Fälle auftreten, in denen http zu https umgeleitet wird. – Hazok

+2

Dein 'du' macht da nichts. – oneloop