Bei dieser Zeile die Einrückung um eine Ebene verringern.
Code: Alles auswählen
return Response(respond_to_client(), mimetype='text/event-stream')
Ansonsten passiert gar nichts, da in der Funktion
listen die Funktion
respond_to_client definiert wird, aber nie aufgerufen.
Die Reduzierung der Einrückung bewirkt dann, dass das Response-Objekt mit dem Generator
respond_to_client aufgerufen und dann auch zurückgegeben wird.
Dann musst du dir noch mal die Syntax ansehen, um Strings zu formatieren. Es gibt auch f-strings. Bin zwar kein JS-Experte, aber etwas einfacher wäre das sicherlich, wenn du eine Datei zurücklieferst und diese kannst du ja alle x-Sekunden durch Javascript abholen lassen. Das geht auch mit bytes und BytesIO. Wobei schon allein durch die Nutzung von Matplotlib Schreibzugriffe auf das Dateisystem stattfinden (hauptsächlich Cache).
Dateien kann man übrigens mit
flask.send_file zurückgeben. Wenn man Binärdaten (bytes, BytesIO) als Quelle angibt, kann der Mimetype nicht ermittelt werden. Man kann aber einen Dateinamen angeben, wodurch dann auch der Mimetype automatisch gesetzt wird.
Erweiterung des Beispielcodes.
Code: Alles auswählen
# zusätzlicher import
from flask import send_file
# vorheriger code
# zusätzliche Route
@app.route("/statistik.png")
def stat():
return send_file(BytesIO(my_image), download_name="statistik.png")
Die Route Statistik liefert das Bild als statistik.png aus.
Ganz wichtig, niemals den User den Pfad bzw. den Dateinamen bestimmen lassen.
Das gilt auch, wenn z.B. durch JavaScript ein get-Request gemacht wird, um irgendwas abzohlen.
Wenn dann der Query in der URL oder Inhalt im Body (json z.B.) blind von der Webanwendung übernommen wird, kann der Angreifer auch andere Dateien öffnen.
Dann muss ich noch anmerken, dass der Filter
safe im vorherigen Beispiel verwendet worden ist. Das soll davor schützen, dass HTML-Quelltext von der Interpretation ausgeschlossen wird. Das ist besonders dann wichtig, wenn man sich den HTML-Tag im Programm erstellt. Mit Beispiel wo jinja2.Template direkt verwendet wird, geht das, weil dort nicht automatisch Filter angewandt werden. D.h. der String wird nicht verändert. Macht man es hingegen richtig mit fllask.render_template, wird der Filter immer angewandt, es seiden man verwendet den Filter safe. D.h. wenn du weiterhin den gesammten HTML-Tag als string ausliefern willst, wird safe benötigt.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server