PHP Kommunikation mit Python

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
rieg
User
Beiträge: 3
Registriert: Samstag 27. Oktober 2018, 16:17

Hallo zusammen,

ich habe mir mit einem Raspberry Pi eine Haussteuerung gebastelt. Die Logik der Haussteuerung wurde mit Python 3 realisiert. Mit PHP/HTML habe ich mir eine kleine rudimentäre Web-GUI erstellt. Der Webserver läuft am selben PI.
Ich möchte nun Daten (z.B. zyklische Temperaturwerte von der Haussteuerung zur GUI oder Eingabe-Parameter von der GUI zur Haussteuerung) zwischen der Web-GUI (PHP) und der Steuerungslogik (Python) austauschen. Wie macht man das? Sind da (Web)Sockets das Richtige? Gibt es Codetemplates für meinen Anwendungsfall.

Schon mal vielen lieben Dank im Voraus für eure Hilfe!

Schöne Grüße!
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

PHP und Python zu mischen ist natuerlich moeglich, aber ich wuerde dir davon abraten. Schreib doch einfach den Server auch in Python, zB mit tornado. Da hast du dann alles in einem Programm.

Falls es PHP sein muss, kannst du es zB mit einem UNIX-Domain-Socket probieren, aus PHP an das Python-Programm Nachrichten zu schicken, und natuerlich auch umgekehrt. Es bietet sich allerdings an, da eine Abstraktion wie zB ZeroMQ zu benutzen, weil das mit der socket-Programmierung etwas hakeliger ist, als die Milliarden schlechten Beispiele im Netz.
rieg
User
Beiträge: 3
Registriert: Samstag 27. Oktober 2018, 16:17

Ja...es gibt Milliarden Socket-Beispiele im Netz...aber mit denen bin ich eben auch nicht weiter gekommen.
Die Idee einen Python-Webserver zu verwenden finde ich ganz interessant...hab dahingehend auch schon etwas recherchiert...habe aber bisher nur Beispiele gefunden, wo reines HTML am Python-Webserver aufgerufen wird.
Wie bekomme ich da aber Dynamik rein? Also wie bekomme ich bspw. die Daten von einem HTML -Eingabeformular ins Python?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das du nur fuer das eine Beispiele gefunden haben willst kann ich jetzt nicht so ganz glauben. Das ist ja mehr oder weniger der ganze Daseinszweck, sonst reichen ja HTML-Seiten in statischer Ausfuehrung.

Generell bekommt der Webserver die Daten wahlweise als klassisches Request, mit der entsprechenden POST oder GET-Methode. Oder eben per websocket, wenn man etwas mit single-page machen will.

Ein kleines Tutorial mit Tornado (das ist ganz gut, weil es asynchron ist, und dadurch erlaubt, das du mit websocket spaeter arbeitest) ist zB das hier: https://opensource.com/article/18/6/tornado-framework
rieg
User
Beiträge: 3
Registriert: Samstag 27. Oktober 2018, 16:17

Vielen Dank für deine schnellen Antworten...da werde ich mich jetzt mal einlesen müssen ;-)
Zwei kurze Fragen noch...bin ja nicht ganz so erfahren...was bedeutet "wenn man etwas mit singel-page machen will" und "das ist ganz gut, weil es asynchron ist"?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Heutzutage sind viele Anwendungen "single-page". Das heisst, sie laden sich nur einmal am Anfang, und danach werden nur per JavaScript Anfragen an den Server gestellt, bzw. vom server Daten geliefert. Facebook ist das beruehmteste Beispiel, aber viele andere auch. Und asynchron ist in dem Tutorial erklaert...
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Wie bekomme ich da aber Dynamik rein? Also wie bekomme ich bspw. die Daten von einem HTML -Eingabeformular ins Python?
Das geht auch mit einem "klassischen" Request-Response Zyklus. Also du sendet das ausgefültte HTML-Formluar als POST-Request an den Server, dort liest Python die POST-Daten aus, macht damit was und liefert eine neue HTML-Seite zurück. Die wird serverseitig über eine Python Template-Engine wie Jinja2 generiert.

Bei etwas mehr Dynamik ist der Ansatz mit JavaScript aber IMHO in der Tat besser. Heißt, dass JS der Seite holt z.B. mit `fetch()` die Daten vom Server, wo sie der in Python geschriebene, serverseitige Teil ausliefert. Wenn du es serverseitig asynchron machen möchtest, ist der Klassiker Tornado. Es gibt auch aber andere asynchrone Frameworks wie Sanic, wo die Routen wie bei Flask / Bottle aufgebaut werden.

Gruß, noisefloor
Antworten