Kommunikation mit Python

  • Hallo zusammen,

    die Kommunikation zwischen Webseite und Python-Programm habe ich mit Websockets realisiert. D.h. wenn ich bspw. einen Button drücke, dann ruft das OnClick-Event die JavaScript-Funktion "messageToServer(...)" auf. Soweit so gut...

    Nun habe ich eine HTML-Form, die beim Drücken des Submit-Buttons ein PHP-File aufruft. In diesem php-File wird bspw. ein XML-File am Web-Server gespeichert. Nach dem erfolgreichen speichern der XML-Datei, möchte ich die JavaScript-Funktion "messageToServer(...)" verwenden, um Python etwas zu kommunizieren.

    Eine erste Idee wäre das hier gewesen...


    Code
    <input type="submit" name="submitSave" value="Save" onclick="messageToServer('updateChronjobConfig.fe')">

    Ab und zu funktioniert das auch sogar (eigentlich zu meiner Überraschung)...aber halt nicht immer...leider bin ich zu wenig Experte in Webprogrammierung, aber ich nehme mal an, dass ich ein Timing Problem habe...wichtig ist, dass die Kommunikation zum Python-Programm erst nach dem erfolgreichen schreiben der XML-Datei erfolgt.

    Wie löst man so ein Problem? Oder gehe ich das Ganze konzeptionell falsch an?!?! Ist möglicherweise die Kommunikation mit Python durch Websockets nicht das Richtige für diesen Anwendungsfall? Danke für eure Hilfe im Voraus!

    Gruß

  • Ein direkter Weg wäre u. U. das Python-Skript von PHP aus zu aktivieren.

    Zitat

    wichtig ist, dass die Kommunikation zum Python-Programm erst nach dem erfolgreichen schreiben der XML-Datei erfolgt.

    Dann ist es durchaus wahrscheinlich, dass es ein Timing-Problem ist. Ich sehe da zwei Lösungsmöglichkeiten:

    1. Die Daten mit Ajax an den Server zu schicken. Dann hast Du einen Success-Handler, der aufgerufen wird, wenn das PHP-Skript erfolgreich ausgeführt wurde und kannst darin das messageToServer aufrufen.
    2. Beim Abschicken des Formulars wird die Seite neu geladen. Du kannst das messageToServer beim Neuladen der Seite aufrufen. Ein gängiges Kriterium dafür ist, dass die GET-/POST-Variable für "submitSave" gesetzt ist.
  • Ich hab's mal so probiert...


    PHP
    <?php
        if (isset ( $_GET ["submitSave"] )) {
          include ("chronjobSave.php"); // hier wird die Datei-Operation durchgeführt
          echo "<script type=\"text/javascript\">messageToServer('updateChronjobConfig.fe');</script>";
        }
    ?>


    Funkt leider nicht :(

  • Sieht plausibel aus.

    Hast Du dir die Quelltextansicht im Browser angesehen, ob das Script-Tag dort angezeigt wird, so wie Du es im PHP-Skript ausgegeben hast?

    Ist zuvor auch die Funktion messageToServer definiert worden?

    $_GET entspricht dem method-Attribut in deinem Formular? GET ist offenbar Default.

  • Zitat

    Ist zuvor auch die Funktion messageToServer definiert worden?

    Ja.

    Zitat

    Hast Du dir die Quelltextansicht im Browser angesehen, ob das Script-Tag dort angezeigt wird, so wie Du es im PHP-Skript ausgegeben hast?

    Wird offensichtlich nicht ausgegeben.


    Zitat

    $_GET entspricht dem method-Attribut in deinem Formular?

    Ja

  • Zitat

    Wird offensichtlich nicht ausgegeben.

    Dann würde ich zunächst den GET-Parameter prüfen, ob er richtig gesetzt ist:

    var_dump($_GET);

    Außerdem sollte dieser in der Adresszeile des Browsers sichtbar sein.


    Wenn ich dein erstes Posting lese, vermute ich, dass die PHP-Datei eine andere ist als die, in der das Formular steht?

  • Im Grunde schaut das Ganze so aus...


    PHP
    chronjobSave.php:
    
    <?php
        ...
        // hier finden die Datei-Operationen statt, d.h. das speichern der XML-Files
        ...
    
        echo '<meta http-equiv="Refresh" content="1; url=chronjobs.php">';     
    ?>


    Wenn ich die Java-Script Funktion aus dem if raus gebe, also so wie hier jetzt gepostet, dann wird das script-Element im Seitenquelltext angezeigt. Aber aufgerufen wird "messageToServer(...)" offensichtlich nicht.


    Zitat

    Dann würde ich zunächst den GET-Parameter prüfen

    Die passen...


    Gruss

  • Hast Du die Fehleranzeige für PHP eingeschaltet und einen Blick in die Console des Browsers geworfen? Ich habe da eine kleine Testdatei gemacht, natürlich ohne das ganze Drumherum und damit funktioniert es.

  • Hab jetzt mal einen Blick in die Browser-Konsole geworfen...tatsächlich kommt hier ein Fehler:


    "Uncaught DOMException: Failed to execute 'send' on 'WebSocket': Still in CONNECTING state."


    Wird die Java-Script Funktion über das OnClick-Event des Submit-Buttons aufgerufen, tritt der Fehler nicht auf. Irgend eine Idee, was es da hat? Was bedeutet der Fehler "Still in Connectiong state"?


    Gruss

  • Das scheint zunächst mal eine gute Nachricht zu sein, denn es zeigt offenbar an, dass die Funktion für das Senden jetzt aufgerufen wird. Leider tappe ich ein wenig im Dunkeln, was die Behebung des Fehlers angeht, weil mir die Kenntnisse über Websockets fehlen. Vermutung: Vor dem Senden der Nachricht muss ein Verbindungsaufbau stattfinden und der ist asynchron. Beim Klick auf den Submit-Button bei der ersten Version ist das kein Problem, weil der manuell erfolgt und es einige Zeit dauert, bis der Benutzer mit dem Formular fertig ist. Bei der neuen Version erfolgt das Senden jedoch sofort. I. allg. gibt es jedoch bei asynchronen Vorgängen einen success-Callback wie bei jQuery-Ajax und Du müsstest das Senden dort hinein legen.

  • Was ist denn mit zwei simplen Ajax-Requests?


    Der erste ruft das PHP-Script auf und über EventListening bekommst Du Bescheid, dass das Script durch ist.

    Dann den zweiten Request auf das Python-Script und feddich...

  • Hab leider noch nie was mit Ajax gemacht...habe da daher bis jetzt immer Berührungsängste gehabt...werde es mir jetzt aber ansehen müssen. Hoffe ich komme weiter ?(


    Gruss

  • Zeig einfach, wo Du hängen bleibst. Erstmal solltest Du Dich hier einlesen: https://developer.mozilla.org/de/docs/Web/API/XMLHttpRequest

    Ein simples praktisches Beispiel findest Du dann hier: https://developer.mozilla.org/…uest/Using_XMLHttpRequest


    Sieht auf den ersten Blick kompliziert aus, ist am Ende aber ziemlich simpel.

    Als kleiner Hinweis noch, das kannst Du zum Ansprechen beider Serverscripte verwenden, dem Request ist es egal, welche Datei auf dem Server es ist.

  • Zunächst mal danke für eure Hilfe...


    Bin aber gerade etwas überfordert...das ist alles sehr viel Information und kann leider die Zusammenhänge noch nicht erkennen. :(

    Ist es vielleicht möglich, die Codelistings aus #8 rudimentär auf Ajax und EventListening "umzubauen" damit ich mir mehr vorstellen kann?!?


    Weiß...klingt jetzt etwas faul...kann mir aber gerade überhaupt nicht vorstellen, was ich machen soll...


    Gruß

  • Was genau verwirrt Dich denn? Im Grunde kann man nicht viel mehr sagen, wie die Doku, aber hier mal nur das notwendigste, was Du benötigst, um einen Request abzusetzen:

    Das wäre der erste Request. Nachdem der abgeschlossen ist, würdest du dann in dem EventHandler den zweiten Request aufrufen, mit dem Unterschied, dass Du dort keine PHP- sonder eine Python-Datei triggerst. Der Aufruf ist aber prinzipiell der gleiche...

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!