Seite 1 von 1

Mit Python POST an PHP Programm schicken

Verfasst: Freitag 22. Januar 2010, 18:26
von Maaaario
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...

Verfasst: Freitag 22. Januar 2010, 18:32
von Hyperion
Dazu solltest Du in der urllib etwas finden! Dort gibt es auch Beispiele, die das zeigen. Ist ganz einfach.

Verfasst: Freitag 22. Januar 2010, 18:33
von Dav1d
das geht mit der urllib2 (Python 2.X) oder urllib.request (Python 3.X)

http://docs.python.org/library/urllib2. ... b2.urlopen

Danke

Verfasst: Freitag 22. Januar 2010, 18:55
von Maaaario
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:

Verfasst: Freitag 22. Januar 2010, 19:23
von Hyperion
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()

Verfasst: Freitag 22. Januar 2010, 19:34
von Maaaario

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? :( :( :( :( :( :( :(

Verfasst: Freitag 22. Januar 2010, 19:40
von Hyperion
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?

Verfasst: Freitag 22. Januar 2010, 19:48
von Maaaario
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

Verfasst: Freitag 22. Januar 2010, 19:55
von Hyperion
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!

Verfasst: Freitag 22. Januar 2010, 19:59
von Panke
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")))

Verfasst: Freitag 22. Januar 2010, 20:29
von Dav1d
wieso so umständlich

Code: Alles auswählen

>>> urlencode({'test' : 'ein text'})
'test=ein+text'

Verfasst: Freitag 22. Januar 2010, 21:09
von Maaaario
: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