Flask APP mit Button zur funktionalen Steuerung

Django, Flask, Bottle, WSGI, CGI…
Antworten
DL3AD
User
Beiträge: 72
Registriert: Montag 31. August 2015, 19:03

Hallo in die Runde,
ich habe mal erste Gehversuche mit Flask gemacht , da ich gern eine Steuerung für eine Hardware über den Browser machen möchte.
Eine Desktopapp läuft schon einige Zeit.

Auf der Webseite sind etliche Button zu realisieren und jeder Button soll eine Python Funktion aufrufen.
Habe mal testweise folgendes realisiert.

Code: Alles auswählen

from flask import Flask, render_template, request

app = Flask(__name__)

@app.route('/')
def index():
    return render_template("index.html")

@app.route('/Btn01',methods=['POST', 'GET'])
def fkt01():
    print("Button 01 Klick")
    return '',204

@app.route('/Btn02',methods=['POST', 'GET'])
def fkt02():
    print("Button 02 Klick")
    return '',204



if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000, debug=True)

und der HTML Teil

Code: Alles auswählen

<!DOCTYPE html>
<html lang="de">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Button Test 014</title>
</head>
<body>
  <a href="Btn01"><button>Button 01</button></a>
  <a href="Btn02"><button>Button 02</button></a>  
</body>
</html>
Dass funktionier auch soweit - alles ohne Ajax und Javascript

Frage: Ist dass soweit eine passable Lösung oder gibt es vieleicht Verbesserungsvorschläge.
Benutzeravatar
__blackjack__
User
Beiträge: 14295
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Warum GET und POST? Und kann das eventuell Probleme geben weil AFAIK der Browser solche Antworten zumindest bei GET cachen darf‽
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Benutzeravatar
noisefloor
User
Beiträge: 4296
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

man sollte auf Routen nur Methoden akzeptieren, die man wirklich braucht. POST ist im obigen Beispiel ziemlich sinnvoll, weil ja noch nicht mal geprüft wird, ob ein GET oder POST Request angekommen ist. Im obigen Beispiel kann / sollte man mit Variablen in der Route arbeiten, um Codewiederholungen zu reduzieren.

Ob der Weg mittelfristig der richtige ist - kein sein, kann nicht sein. Dazu ist der Code zu generisch und die tatsächlichen Anforderungen zu undefiniert. Ggf. macht es mehr Sinn, im Browser auf JavaScript und die fetch-API zu gehen. Was am serverseitigen Code gar nicht viel ändert - du brauchst ja nach wie vor Routen, die via `fetch` angesprochen werden und wo was passiert. Es ändert sich eher der browserseitige Teil und das ggf. nicht jedes Mal die Seite neu geladen werden muss.

Persönlich würde ich _nicht_ 204 zurück liefern sondern entweder eine Bestätigung, dass die serverseitige Aktion mit der Hardware erfolgreich war oder halt eine Fehler. Aktuell ist das eine Blackbox - die klickst auf den Button und es passiert clientseitig nichts.

Gruß, noisefloor
DL3AD
User
Beiträge: 72
Registriert: Montag 31. August 2015, 19:03

Danke für die Rückmeldungen.

@__blackjack__
wie kann ich es dann besser machen ?

Ajax oder Javascript will ich bewust vermeiden !
bei 204 wird die Seite doch nicht neu geladen - oder liege ich da falsch ?
Wenn ich in einer GUI einen Butten Drücke dann habe ich auch keiune Rückmeldung wenn ich expliziet nix einbaue.
Ich beschäftige mich gerade mit Turbo Flask bezüglich Rückmeldungen / Aktualisierung vin Werten auf dem Client - bin noch nicht soweit im Erkenntnissprozess
Benutzeravatar
noisefloor
User
Beiträge: 4296
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

rein Interesse halber:
Ajax oder Javascript will ich bewust vermeiden !
Weil...? BTW: Das "J" in Ajax steht für JavaScript. Und AJAX ist die ältere Methode, aktuell (und IMHO einfacher ist die fetch-API von JavaScript.
bei 204 wird die Seite doch nicht neu geladen - oder liege ich da falsch ?
Korrekt.
Wenn ich in einer GUI einen Butten Drücke dann habe ich auch keiune Rückmeldung wenn ich expliziet nix einbaue.
Wenn das für dich OK ist - ok. Ist halt ungewöhnlich, dass man nicht wissen will, ob was passiert ist.
Ich beschäftige mich gerade mit Turbo Flask bezüglich Rückmeldungen / Aktualisierung vin Werten auf dem Client - bin noch nicht soweit im Erkenntnissprozess
Turbo Flask implementiert, soweit ich das sehe, WebSockets zwischen Server und Client. Natürlich via JavaScript. Ich sehe aber hier nicht, worum du eine Websocket-Verbindung zwischen Client und Server brauchst und das nicht via fetch-API lösen könntest.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 14295
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@DL3AD: Wenn GET gecached werden darf, dann wäre es sinnvoller POST zu machen. Sonst kann es passieren das GET nichts bewirkt, weil der Browser das gar nicht erst macht, weil er ja noch eine Antwort im Cache hat.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
DL3AD
User
Beiträge: 72
Registriert: Montag 31. August 2015, 19:03

... habe es mal auf POST umgebaut

Code: Alles auswählen

<!DOCTYPE html>
<html lang="de">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Button Test 017</title>
</head>
<body>
    <form action="/Btn01" method="POST"><button>Button 01</button></form>
    <form action="/Btn02" method="POST"><button>Button 02</button></form>
</body>
</html>
Habe das mit den POST nun über form gemacht - ist dass OK oder geht das auch eleganter ?

Als nächsten Test möchte ich ein Label vom Server aus mit neuen sich ständig veränderlichen Werten beschreiben - wie lößt man das am besten ?
Benutzeravatar
noisefloor
User
Beiträge: 4296
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Als nächsten Test möchte ich ein Label vom Server aus mit neuen sich ständig veränderlichen Werten beschreiben - wie lößt man das am besten ?
Entweder die Seite nach einem Request serverseitig neu rendern ausliefern oder bei Verwendung der JS fetch-API den gewünschten Wert als Antwort auf den Request zurück liefern und clientseitig das Label des Buttons via JS ändern.

Gruß, noisefloor
DL3AD
User
Beiträge: 72
Registriert: Montag 31. August 2015, 19:03

Die Label sind unabhängig von den Button - in meiner Hardware ändert sich zufällig ein Wert und den möchte ich dann ohne User Interaktion auf der Seite aktualisieren - am besten ohne die ganze Seite neu zu laden.
Benutzeravatar
noisefloor
User
Beiträge: 4296
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Was bezeichnest du denn als "Label" genau? Label ist im HTML Kontext ja eindeutig definiert.

Der Punkt "ohne Nutzerinteraktion" ist dabei wichtig - hättest du in der Frage schon erwähnen sollen, weil das die mögliche Technik ändert. Es gibt würde ich sagen drei Ansätze:

* periodisch via JS und fetch-API den Server auf Änderungen abfragen und die Seite clientseitig mit der Antwort der Abfrage via JS aktualisieren.
* bidirektionale Kommunikation per Websocket, braucht auch Client-seitig JavaScript
* SSE - Server Side Events, mit denen der Server Nachrichten an den Client pushen kann. Braucht clientseitig auch JS.

Die ersten beiden Weg sind IMO deutlich gängiger als SSE. Wenn du "Echtzeit" brauchst sind Websockets der Weg, weil bei der fetch-API halt periodisch abgerufen wird. "periodisch" kann zwar auch hochfrequent sein, dann stellt sich aber die Frage der Sinnhaftigkeit gegenüber Websockets.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 14295
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Womit wir dann bei JavaScript sind. Da führt nicht wirklich ein Weg drum herum. Damit braucht man dann aber auch den 204-Hack nicht mehr und kann auch bei den Buttons eine Rückmeldung an das Front-End senden ob der Aufruf erfolgreich war.
„Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.“ — Brian W. Kernighan
Antworten