Mit Python POST an PHP Programm schicken

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Maaaario
User
Beiträge: 5
Registriert: Freitag 22. Januar 2010, 18:19

Hey!
Ich bin neu hier und habe ein Problem!
Habe von meinem Lehrer die Aufgabe bekommen, eine CSV Datei von einem Server einzulesen, sie zu bearbeiten und als STRING an eine PHP Datei schicken die den STRING dann verwenden kann.

Ich habe allerdings keine ahnung wie man einen POST Request in Python ausführt ! Kann mir das bitte einer Erklären?

Also wenn jetzt das z.B. der server www.blabla.at/ heißt und die php datei welche ausgeführt werden soll in /www/ausfuehren.php dem ordner liegt.
Und der String der Mitgeschickt werden soll string heißt.
Brauche Dringend Hilfe :( :( :( :( :( :( :(

DANKE
MFG Mario

//Sorry ich wusste nicht in welchen Bereich ich das Stecken kann...
Zuletzt geändert von Maaaario am Freitag 22. Januar 2010, 18:33, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Dazu solltest Du in der urllib etwas finden! Dort gibt es auch Beispiele, die das zeigen. Ist ganz einfach.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

das geht mit der urllib2 (Python 2.X) oder urllib.request (Python 3.X)

http://docs.python.org/library/urllib2. ... b2.urlopen
the more they change the more they stay the same
Maaaario
User
Beiträge: 5
Registriert: Freitag 22. Januar 2010, 18:19

Danke für Eure antworten...
Mein Englisch hält sich in Grenzen und ich habe versucht das umzusetzen was auf der Seite steht.
Das ist dabei herausgekommen:

Code: Alles auswählen

        import urllib2
        urllib2.urlopen("http://www2.SCHULSERVER.ac.at/d08090/upload.php","?CSV="+string)
Wenn ich jetzt in meine CSV datei schaue ist diese leer.

Ist der Python code richtig oder mache ich etwas falsch?

// Die CSV Datei wird durch die upload.php aufgefüllt (Besser gesagt: SOLLTE) :oops: :oops:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich dachte die Parameter stammen aus einer CSV-Datei? *wunder*

Du solltest die Paramater besser nicht von Hand zusammenbauen:

Code: Alles auswählen

In [20]: from urllib import urlencode

In [21]: params = urlencode((("fname", "Max"), ("lname", "Mustermann")))

In [22]: from urllib2 import urlopen

In [23]: page = urlopen(r"http://www.snee.com/xml/crud/posttest.cgi", params)

In [24]: page.read()
Out[24]: '<html><head><title>posted data</title></head><body><h1>posted data</h1
><p>First name: "Max"</p><p>Last name: "Mustermann"</p><p>REQUEST_URI: "/xml/cru
d/posttest.cgi"</p><p>QUERY_STRING: ""</p><p>CONTENT_LENGTH: "26"</p><p>content
passed via STDIN: "fname=Max&lname=Mustermann"</p></body></html>\n'

In [25]: page.close()
Maaaario
User
Beiträge: 5
Registriert: Freitag 22. Januar 2010, 18:19

Code: Alles auswählen

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "test.py", line 66, in <module>
    main()
  File "test.py", line 59, in main
    params = urlencode(("csv", string))
  File "/usr/lib/python2.6/urllib.py", line 1254, in urlencode
    raise TypeError
TypeError: not a valid non-string sequence or mapping object
Ich versteh das nicht. Ist das jetzt mein Fehler oder der Fehler von Urllib? :( :( :( :( :( :( :(
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Maaaario hat geschrieben: Ich versteh das nicht. Ist das jetzt mein Fehler oder der Fehler von Urllib? :( :( :( :( :( :( :(
Wie soll man das ohne den dazugehörigen Quellcode sagen? Und was bringen die 7 Smileys?
Maaaario
User
Beiträge: 5
Registriert: Freitag 22. Januar 2010, 18:19

Tut mir leid....Bin schon etwas "verrückt", da ich schon den Ganzen Tag daran arbeite.

Also ich erklär mal was das Programm machen soll: Es berechnet durchschnittt und Mittelwert aus den % die ein Schüler in einem Fach hat und schreibt diese dann is den String string. Danach soll der String per POST-Request an eine PHP datei auf meinem Schulserver gesendet werden.

Code: Alles auswählen

        for i in listemit:
                for u in i:
                        string = string + str(u) + ","
                string = string + "\n"
        string= string + "AVERAGE" + "," + str(mittelgesamt/len(listemit)) + "," + str(notegesamt/len(listemit))
        from urllib import urlencode
        from urllib import urlopen
        params = urlencode(("csv", "asdf"))
        page=urlopen("http://www2.SCHULSERVER.ac.at/d08090/upload.php",params )
Wie gesagt, immer noch der selbe doofe Fehler

Code: Alles auswählen

TypeError: not a valid non-string sequence or mapping object
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Welche Zeile? Was für Objekte stehen in listemit? Wieso testest Du nicht erst einmal das Absenden "manuell", also ohne den Rest des Programms?

Halte Dich mehr an PEP8!
Panke
User
Beiträge: 185
Registriert: Sonntag 18. März 2007, 19:26

Die fehlt ein paar Klammern.

Vergleiche

Code: Alles auswählen

params = urlencode(("csv", "asdf"))
mit

Code: Alles auswählen

 params = urlencode((("fname", "Max"), ("lname", "Mustermann")))
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

wieso so umständlich

Code: Alles auswählen

>>> urlencode({'test' : 'ein text'})
'test=ein+text'
the more they change the more they stay the same
Maaaario
User
Beiträge: 5
Registriert: Freitag 22. Januar 2010, 18:19

:D :D

Ich habe die Lösung mittlerweile selber gefunden :D

Ich weiß nicht ob das ganz korrekt ist aber es funktioniert :D

Code: Alles auswählen

       import urllib,urllib2
        url = 'http://www2.SCHULSERVER.ac.at/d08090/upload.php'
        parameters = {'cvs' : string}
        data = urllib.urlencode(parameters)
        request = urllib2.Request(url, data)
        response = urllib2.urlopen(request) 
        page = response.read()
Ich habe die Ganze zeit versucht einen GET statt einen POST request zu machen :S
Antworten