Forum: PC-Programmierung [HTML] [Python] Parameter an CGI-Skript übergeben


von Thorsten (Gast)


Lesenswert?

Guten Tag,

ich bastel gerade an einem Python-Skript zur Steuerung meines 
Smarthomes. Als Front-End möchte ich eine Website im lokalen Netz 
ablegen, welches mit Bootstrap ein wenig hübsch gemacht werden soll.

Was geschehen soll:
Wie Website soll z.B. ein Button zum Lichteinschalten gedrückt werden, 
die Parameter gehen ans Skript und werden dort verarbeitet.

Was ich gemacht habe:
Auf der HTML-Seite habe ich ein Formular erstellt, welches via 
get-Request die Paramter ans CGI-Skript übergibt. Das Skript erkennt die 
Paramater auch korrekt und meine Leuchte beginnt zu strahlen :-D

Fast perfekt, aber.... wenn ich den Request ausführe, bekomme ich den 
Aufruf im Browser angezeigt, in meinem Fall

http://localhost/cgi-bin/test.py?Knopf=Blablub

Das möchte ich allerdings nicht, ich möchte nur, dass bei Knopfdruck die 
Paramter übertragen werden und sonst nichts.

Momentan hab ich im Formular das target auf _blank gesetzt, so dass ich 
zumindest nur ein neues TAB öffne, aber schön ist das nicht.

Gibt es eine Art "SEND"-Befehl mit JS oder sonstwas, so dass ich mein 
Problem beheben kann?

Vielen Dank für Eure Rückmeldung. Den Code habe ich mal weggelssen, da 
er, glaube ich, keinen Mehrwert für die Frage liefert.

Vielen Dank.

von guest (Gast)


Lesenswert?

Thorsten schrieb:
> Gibt es eine Art "SEND"-Befehl mit JS oder sonstwas, so dass ich mein
> Problem beheben kann?

XMLHttpRequest

Ansonsten gibt es auch noch Websockets.

von Thorsten (Gast)


Lesenswert?

Damit probiere ich es nochmal und melde mich dann, wenn es hoffentlich 
geklappt hat :-)

Dankeschön.

von Sheeva P. (sheevaplug)


Lesenswert?

Hallo Thorsten,

Thorsten schrieb:
> ich bastel gerade an einem Python-Skript zur Steuerung meines
> Smarthomes. Als Front-End möchte ich eine Website im lokalen Netz
> ablegen, welches mit Bootstrap ein wenig hübsch gemacht werden soll.
>
> Was geschehen soll:
> Wie Website soll z.B. ein Button zum Lichteinschalten gedrückt werden,
> die Parameter gehen ans Skript und werden dort verarbeitet.

Keine Rückgabe? Kein Indikator auf der Seite, ob die Lampe nun schon 
leuchtet oder nicht? (Und wehe Du sagst jetzt "ja aber ich seh' doch, ob 
das Licht an ist"... ;-))

> Auf der HTML-Seite habe ich ein Formular erstellt, welches via
> get-Request die Paramter ans CGI-Skript übergibt. Das Skript erkennt die
> Paramater auch korrekt und meine Leuchte beginnt zu strahlen :-D
>
> Fast perfekt, aber.... wenn ich den Request ausführe, bekomme ich den
> Aufruf im Browser angezeigt, in meinem Fall
>
> http://localhost/cgi-bin/test.py?Knopf=Blablub

Im Prinzip gibt es da zwei Varianten: die klassische ist die Übertragung 
eines HTML-Formulars per GET- oder POST-Request, dabei gibt das CGI dann 
wieder eine komplette HTML-Seite zurück, die der Webbrowser dann lädt, 
rendert, und schließlich darstellt.

Die moderne Variante hingegen verwendet Javascript, das beim Druck auf 
den Knopf die Daten Deines Formulars ausliest, sie als XML- oder 
JSON-Request über XMLHttpRequest an den Server überträgt, der sie 
verarbeitet und eine Antwort in XML oder JSON zurückgibt. Die wird dann 
clientseitig von Deinem Javascript entgegen genommen und verarbeitet, 
und das Ergebnis des Request (meistens) auf der Webseite angezeigt. Eine 
beliebte JS-Bibliothek dafür ist beispielsweise JQuery.


Nebenbei -- ich weiß, das hattest Du nicht gefragt und willst es 
vielleicht auch gar nicht wissen -- frage ich mich, warum Du in der 
heutigen Zeit noch auf die antiquierte CGI-Schnittstelle setzt. Mit CGI 
ruft der Webserver für jeden Request ein Programm auf, in Deinem Fall 
also den Python-Interpreter mit Deinem Programm, übergibt ihm den 
Request über sys.stdin und nimmt die Response über sys.stdout entgegen, 
während weitere Ausgaben über sys.stderr üblicherweise direkt im 
ErrorLog des Webservers landen.

Da gibt es heute für die meisten Programmiersprachen deutlich 
effizientere Lösungen, so auch für Python mit seinem Webserver Gateway 
Interface WSGI. Dabei läuft der Python-Interpreter mit Deinem Programm 
im Hintergrund mit, so daß der Interpreter nicht bei jedem Aufruf 
geladen und initialisiert und Dein Programm nicht bei jedem Aufruf 
geladen, interpretiert, in Bytecode überführt und gestartet werden muß. 
Es liegt auf der Hand, daß das deutlich effizienter und performanter ist 
als das alte Common Gateway Interface, je nach Hard- und Software habe 
ich schon Faktor 100 und mehr gesehen.

Darüber hinaus hat Python zwar ein hervorragendes cgi-Modul, das Teil 
der Standardinstallation ist, aber verglichen mit modernen Frameworks 
ist das PITA: pain in the ass (sagt jemand, der seine ersten CGIs 
seinerzeit in C geschrieben hat). Für Python gibts heute eine Vielzahl 
von Webframeworks für jede gewünschte Anwendung: Fullstack-Frameworks 
mit Template-Engine, Datenbank-Abstraktion(en), Benutzer- und 
Sessionverwaltung, wie etwa Zope, Django, Pylons oder TurboGears, aber 
auch leichtgewichtige und einfache Webframeworks wie etwa Bottle oder 
mein heutiger Liebling Flask. Die sind im Kern nur Mapper von URLs auf 
Funktionen und haben eine leichtgewichtige Template-Engine dabei, lassen 
sich allerdings modular mit so ziemlich allem erweitern, was des 
Webentwicklers schwarzes Herzchen begehrt. ;-)

Vorteil: die Webframeworks laufen als WSGI und damit wesentlich 
effizienter als mit CGI, und die betreffenden Frameworks erfordern viel 
weniger Arbeit, Boilerplate, Validierungs-Gehampel oder anderen Hantier.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.