Daten an Webserver übertragen

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo liebe Leute ...

    ich bin neu und unwissend am Pi ;-).

    Ich bräuchte bitte eure Hilfe bei der Datenübertragung zu einer Webseite.

    ich habe ein Programm was ohne weiteres funktioniert:

    nun habe ich ein weiteres Programm, welches mit die Daten von einem Sensor ausliest.
    Wenn ich nun das Programm in dieses einbaue,
    werden keine Daten an den Webserver geschickt.
    hat einer eine Idee warum ?

    Irgendwo ist da der Wurm drin und ich finde ihn nicht.


    vom Bauchgefühl her hat es vielleicht etwas mit der def main() hier zu tun ???
    herzlichen Dank schon einmal für die Hilfe und Anregungen
    BkuP

  • 1. Die Einrückungen deines zweiten Scripts sind fehlerhaft, und machen es daher schwer es zu verstehen. Dadurch können wir jetzt auch nicht ersehen ob da irgendwo die Ursache für dein Problem liegt...
    Die vielen Leerzeilen zum Ende des Scripts hin sorgen ebenfalls dafür das man schnell den Überblick verliert.
    FAQ => Nützliche Links / Linksammlung => HowTo: CODE / PHP Code im Forum posten

    2. Das erste Script ist für Python2, das zweite aber für Python3.... Python3 ist nicht vollständig abwärtskompatibel. Hinzu kommt das der Umgang in Python3 'echter' ist und man gerade im Bezug auf Sockets usw die Daten encode/serialize'n muss.

    Generell solltest du vielleicht wissen das immer nur eins zur selben Zeit gemacht werden kann. Dein Script kann nicht mehreres gleichzeitig/parallel abhandeln, zum Beispiel blockiert der Verbindungsaufbau alles andere.

    Das von dir gezeigte hat bisher aber nichts mit der Überschrift zu tun? :s "message" beinhaltet zwar eine GET Übergabe allerdings macht das via Socket doch gar kein Sinn? Wieso nutzt du dann nicht direkt "requests" oder "urllib" zum übergeben des GETs ? Was hat das mit dem Socket auf sich?

    Was ich dir ans Herz lege:
    FAQ => Nützliche Links / Linksammlung => [Python] Webserver, Websocket und ein bisschen AJAX

  • Hallo meigrafd,

    herzlichen dank für deine Antwort.

    soweit ich das verstanden habe, wird über Socket die Verbindung zum Server aufgebaut und mit dem GET werden die Daten ( zur Zeit 3 Variable [x, y, z]) übergeben.
    Diese werden dann Server-Seitig von einem .php -Script in Empfang genommen und in eine Datenbank eingetragen.
    Das Format ist dann: http://www.google.at/irgendwas.php&x&y&z
    wie gesagt, mein Programmteil alleine macht genau das was er soll.
    Nur eben nicht in dem anderem Programm eingefügt.
    Es gibt auch keinerlei Fehlermeldung !!!

    Ich möchte eben über das Internet Daten in eine Datenbank schreiben, ohne irgendwelche Ports oder dergleichen öffnen zu müssen, und dennoch ein bisschen auf Sicherheit zu achten.

    Wenn hier wer eine bessere Lösung hat/weiß bin oder wäre ich natürlich sehr dankbar.
    Das mit der Einrückung ist komisch, da ich den Code 1:1 rein kopiert habe.
    Es geht aber meiner Meinung um den Teil in der main() bzw. zwischen den # ===== edit .. ===== Teilen von mir.

    Mfg
    BkuP

  • Wie gesagt, brauchst du dann nur das "requests" Module und kannst "socket" komplett weg lassen. Das was du aktuell machst ist nach dem Motto "von hinten durch die Brust ins Auge".

    [code=php]
    import requests

    x = 'nc.'
    y = 'nc.'
    z = 'nc.'
    data_ = {
    'x': x,
    'y': y,
    'z': z,
    }
    url = 'http://127.0.0.1/insert2.php'
    requests.get(url, params=data_)
    [/php]

    Wenn du auf Sicherheit achten möchtest dann solltest du nicht GET nehmen sondern POST:
    [code=php]
    import requests

    x = 'nc.'
    y = 'nc.'
    z = 'nc.'
    data_ = {
    'x': x,
    'y': y,
    'z': z,
    }
    url = "http://127.0.0.1/insert2.php"
    requests.post(url, data=data_)
    [/php]


    Und solange du den Code nicht mit korrekten Einrückungen zeigst kann man dazu nichts weiter sagen...

  • Hallo meigrafd,

    herzlichen Dank für deine Hilfe.
    Mit deinem Code wird jetzt ein Datensatz in die Datenbank eingetragen.
    allerdings bleiben die Datenfelder leer.
    ich habe es mit:

    Code
    data_ = {
            '?x=': x,
            '&y=': y,
            '&z=': z,
    }

    versucht, leider kein Erfolg.
    Hast du noch einen Tipp für mich ? ;)

    Mfg
    BkuP

    Einmal editiert, zuletzt von BkuP (8. August 2017 um 22:31)

  • Zitat von "BkuP" pid='294613' dateline='1502224218'
    Code
    data_ = {
           '?x=': x,
           '&y=': y,
           '&z=': z,
    }

    Das ist falsch. Die Daten werden von requests korrekt übergeben. Mach es bitte so wie ich oben gepostet habe, nicht ? oder & usw einfügen: data_ = { 'x': x, 'y': y, 'z': z }
    "requests" übergibt es dann richtig, so wie es für GET oder POST erforderlich ist. So schlau ist das Module scho :fies:

    Debug es einfach indem du über eine spezielle/extra/separate PHP Datei $_GET anzeigen lässt:

    [code=php]
    <?php
    echo "<pre>";
    var_dump($_GET);
    echo "</pre>";
    ?>
    [/php]Und google dann mal nach: python requests

  • Hi,

    also, ich habe wieder auf deinen Code 'retourgebaut', danke für den Hinweis ...

    payload = {'x': x, 'y': y, 'z': z}
    url = "http://192.168.33.172/insert2.php"
    requests.post(url, data=payload)
    print url, payload

    das Print liefert:
    http://192.168.33.172/insert2.php {'y': 'nc.', 'x': ' 27.181', 'z': 'nc.'}

    der php-Code von dir bringt leider nichts, da die Seite ja auf dem Server läuft und nur auf Daten wartet.
    Herzlichen Dank trotzdem !!!
    ich werde jetzt aber zu Bett gehen und morgen weitermachen.

    MfG
    BkuP

  • Zitat von &quot;meigrafd&quot; pid='294607' dateline='1502222048'


    [...]Wenn du auf Sicherheit achten möchtest dann solltest du nicht GET nehmen sondern POST:[...]

    Was hat das mit Sicherheit zu tun? Ach ja, rein gar nichts..

    BkuP
    Mit ``print url, payload`` wird dir auch nicht die URL angezeigt
    Akzeptiert der Server post-Anfragen überhaupt?

  • Zitat von &quot;BkuP&quot; pid='294621' dateline='1502226989'


    payload = {'x': x, 'y': y, 'z': z}
    url = "http://192.168.33.172/insert2.php"
    requests.post(url, data=payload)
    print url, payload

    das Print liefert:
    http://192.168.33.172/insert2.php {'y': 'nc.', 'x': ' 27.181', 'z': 'nc.'}

    Auch das ist falsch :fies:

    Man ruft ja eine Methode des "requests" Module/Klasse auf und übergibt "url" sowie "data" als Parameter. In der Methode wird das dann entsprechend behandelt und dann auch korrekt an die URL übergeben. Also wenn dann musst du dir aus der Methode die entsprechende Konstante ausgeben lassen, so wie es dann intern in dem Module behandelt wurde.
    Wenn du nach "python requests" googlest findest du aber eigentlich auch sofort entsprechende Seiten wo das genauer beschrieben wird oder Beispiele gezeigt werden.

    Beispiel:

    Er bildet die URL also wie gewünscht.

    Wenn du nun eine POST Übergabe machen möchtest muss es nicht "params=" sein, sondern "data=" und du musst natürlich auch requests.post() verwenden:


    Auch das ist korrekt da eine POST Übergabe nicht die url verändert. Was man sich hier dann zusätzlich anzeigen lassen kann ist besagte Rückgabe der Seite, sofern es eine gibt... Aber wir senden hier ja an ein speziell von uns/mir erstelltes PHP Script:

    sieht ein wenig wirr aus, wers aber kennt sieht das es keine GET Übergabe gab sondern nur eine POST und diese war ebenfalls korrekt.

    Da ich absolut kein Schimmer habe wie Dein PHP Script aussieht kann ich leider auch nicht nachvollziehen wieso das bei Dir nicht funktioniert - hier tut es jedenfalls ;)


    PS: Die url kannst auch du ansprechen für Tests, hab ich absichtlich so gemacht.

  • Hallo Leute,

    ich sagte doch, das ich leider absolut ein Neuling in Python bin, was ordentlich nerft ;)

    so, nochmal von vorne ....

    der 1.Quellcode den ich ganz am Anfang gepostet habe funktioniert einwandfrei !
    sobald ich den aber in das Script, welches die Sensoren ausließt einbaue, funktioniert es nicht mehr.

    Allerdings habt ihr mich darauf hingewiesen, das ich das ganze Zeugs mit den Sockets nicht brauche.
    Mit dem Code von euch werden neue Datensätze erzeugt, allerdings werden die Daten nicht übertragen, bzw. die Datenfelder bleiben leer.
    Es ist aber ein neuer Datensatz, mit neuer ID und ein TimeStamp - Feld da und gefüllt.

    mein jetziger Code am Pi:

    Code
    x = (device.query("R"))
    y = "nc."
    z = "nc."
    
    
    payload = {'x': x, 'y': y, 'z': z}
    url = "http://192.168.33.172/insert2.php"
    requests.post(url, data=payload) 
    print url, payload

    mein Empfangs-Script am Webserver:

    leider habe ich bald keinen Durchblick mehr ;)

    MfG
    BkuP

  • Hast du meinen Beitrag#10 nicht gelesen? :-/
    Daraus sollte eigentlich hervorgehen das du nicht requests.post() nutzen solltest sondern requests.get() und auch nicht "data=" sondern "params=" , da Dein PHP Script $_GET erwartet bzw verwendet.

    Also noch mal - diesmal hoffentlich so das du daran nicht wieder rumspielst und's vermurkst:
    [code=php]
    x = (device.query("R"))
    y = "nc."
    z = "nc."

    payload = {'x': x, 'y': y, 'z': z}
    address = "http://192.168.33.172/insert2.php"
    r = requests.get(address, params=payload)

    print r.url
    [/php]


    PS: In deinem insert2.php fallen mir auch ein paar Fehler auf... Wie zum Beispiel: verifizieren das auch wirklich die benötigten $_GET Übergaben an kommen bevor versucht wird etwas in die Datenbank einzutragen.

  • Hallo,

    hui, das funktioniert jetzt !!!
    Aller Aller Herzlichen Dank !!!

    werde mich mit meinen 45 Jahren direkt in die Materie "reinschmeissen"
    Heute ist das Buch " Raspberry Pi, das umfassende Handbuch von Kofler, Kühnast und Scherbeck " angekommen.
    ein Weiteres Phyton Buch ist unterwegs.
    Da ich aus der Windows Ecke komme, mich aber pers. immer mehr für Linux und den RasPi interessiere freue ich mich hier dabei zu sein!
    Ich hoffe das ich ein Bisschen was hier in Zukunft zurückgeben kann auch wenn es sicherlich ein wenig dauern wird !!
    Wenn einer Fragen bz. Windows oder Bussiness Hardware hat, helfe ich gerne ( ich weiß, ist nicht das richtige Forum, trotzdem!!)!.

    herzlichen Dank !
    MfG
    BkuP

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!