Frage zu Python und Flask

Code-Stücke können hier veröffentlicht werden.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Hallo,

Ich hab da so ein Problem mit Flask und ne allgemein frage dazu (dazu werden wir später kommen)
nun erst mal zu den Scripten die ich habe:

test.py:

Code: Alles auswählen

from flask import Flask, send_from_directory, render_template, request
import os

app = Flask(__name__, template_folder='/volume1/web/info-show/php', static_folder='/volume1/web/info-show/style')

@app.route('/HTTP_Download/stream/<filename>/<path:filepath>')
	def start_one(filename, filepath):
	device_width_get = settings("1")
	device_height_get = settings("2")
	http_url = settings("3")
	autoplay_get = settings("4")
	type_get = settings("5")
	
	return render_template('stream.html',directory=filepath, filename=filename, autoplay=autoplay_get, url=http_url, device_width=device_width_get, device_height=device_height_get, type_data=type_get)

@app.route('/stream/<filename>/<path:directory>')
	def stream_file(filename, directory):
	uploads_temp = os.path.join(directory)
	uploads = "/%s" % uploads_temp
	return send_from_directory(uploads, filename)

@app.route('/download/<filename>/<path:directory>')
def download_file(filename, directory):
	uploads_temp = os.path.join(directory)
	uploads = "/%s" % uploads_temp
	return send_from_directory(uploads, filename, as_attachment=True)

if __name__ == "__main__":
    app.run(host='xxx.xxx.xxx.x', port=777, threaded=True, debug=True)
test.html:

Stream Audio:

Code: Alles auswählen

<div class="audio_bundle">
	<div class="col-xs-12 col-sm-10 col-md-6 col-xs-offset-0 col-sm-offset-1 col-md-offset-2">
		<audio controls autoplay>
			<source src="{{ url_for('stream_file', filename=filename, directory=directory) }}" type="audio/mp3">
		</audio>
	</div>
</div>
Stream Video:

Code: Alles auswählen

<div class="audio_bundle">
	<div class="col-xs-12 col-sm-10 col-md-6 col-xs-offset-0 col-sm-offset-1 col-md-offset-2">
		<video width="320" height="240" controls autoplay>
			<source src="{{ url_for('stream_file', filename=filename, directory=directory) }}" type="video/mp4">
		</video>
	</div>
</div>
den Aufruf starte ich so:

Code: Alles auswählen

http://xxx.xxx.xxx.x/HTTP_Download/stream/filename.mp3/path_to_file
Das Streaming von .mp3 (Musik Datein) Klappt bestens (iPhone / Mac / Windows etc.)

1. Mein erstes Problem ist das wenn ich nun eine .mp3 Datei Downloaden möchte:

Code: Alles auswählen

<a class="btn btn-default btn-xs" href="{{ url_for('download_file', filename=filename, directory=directory) }}">hier klicken</a>
Klappt dies nur auf dem mac und Windows aber nicht auf dem iPhone oder iPad etc. dort wird das Lied nur abgespielt....

2. Nun würde ich gerne auch Videos Streamen was aber gar nicht Funktioniert....
mit dem Code von oben was bei der Musik ging.... bekomme auch im Terminal keinen Fehler ausgegeben ....

Die Allgemeine frage währe ich verwende das alles mit Flask direkt und habe mal gelesen das man besser Gunicorn nutzen sollte nun wollte ich das mal machen habs aber nicht wirklich hin bekommen mein Script über Gunicon zu betreiben...

ich hoffe sehr ihr könnt mir helfen weis nicht mehr was ich noch machen sollte......
Zuletzt geändert von Anonymous am Freitag 14. April 2017, 18:55, insgesamt 1-mal geändert.
Grund: Quelltext in Codebox-Tags gesetzt.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

keiner ne Idee :( ??
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Safari unter iOS versucht immer MP3s abzuspielen, egal was die Header sagen.

Um das Video zu streamen könnte es sein das Features benötigt werden die der Flask Development Server möglicherweise nicht hat.
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@DasIch: Streams sind auch einfach nur Dateien, da braucht der Server nichts spezielles können.

@Kalysto: Dein Einrückung ist kaputt und settings wird nirgends definiert. Die ganzen Parameter werden in Deinem Template sowieso nicht gebraucht. Die kombination /filename/path ist seltsam. Auch solltest Du nicht von außen absolute Pfade unkontrolliert übernehmen. So kann jeder jede beliebige Datei mit den Rechten des Servers lesen. Wenn man damit nicht direkt Sicherheitslücken ausnutzen kann, so kann ein Angreifer immerhin viel Information sammeln, die man normalerweise nicht veröffentlichen will. Ein os.path.join mit nur einem Parameter macht keinen Sinn, und den Pfad einfach so in einen absoluten umzuwandeln ist wie schon geschrieben, gefährlich. Welchen Pfad versuchst Du denn anzusprechen und bist Du auch sicher, dass die Datei existiert. Bei mir funktioniert das alles einwandfrei.
host ist normalerweise 0.0.0.0 und nicht xxx.xxx.xxx.x und Port 777 ist ungewöhnlich und läßt befürchten, dass der Server mit root-Rechten läuft, was das oben beschriebene Problem noch viel schlimmer macht.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

host ist normalerweise 0.0.0.0 und nicht xxx.xxx.xxx.x und Port 777
das kann man so nicht sagen ich möchte eben das der Host: eine bestimmt IP hat und der Port: das selbe ich habe ihn hier als test auf 777 gestellt ansonsten rufe ich diesen mit 666 auf was nichts damit zu tun hat wie er irgend welche root rechte bekommt...
Dein Einrückung ist kaputt
was meinst du damit ??
und settings wird nirgends definiert.
das habe ich hier bewusst weg gelassen weil der nur für meine externe HP von Bedeutung ist.
Die ganzen Parameter werden in Deinem Template sowieso nicht gebraucht
doch werden sie da das nicht das komplette Template war sondern nur der Ausschnitt zum abspielen...
Die kombination /filename/path ist seltsam
wieso ist diese denn Komisch ?? ich rufe das so auf....

Code: Alles auswählen

http://xxx.xxx.xxx.x/filename/<filename.mp3>/<path_to_file>
<> sollen darstellen das diese weitergegeben werden an Route...
So kann jeder jede beliebige Datei mit den Rechten des Servers lesen. Wenn man damit nicht direkt Sicherheitslücken ausnutzen kann, so kann ein Angreifer immerhin viel Information sammeln, die man normalerweise nicht veröffentlichen will.
wie soll ich die Lieber und videos sonst ansprechen ?? wenn nicht über direkte Pfade ??
Ein os.path.join mit nur einem Parameter macht keinen Sinn, und den Pfad einfach so in einen absoluten umzuwandeln ist wie schon geschrieben, gefährlich.
okey das kann ich ändern ;) und wie oben geschrieben wie würdest du dies sonst lösen ??
Welchen Pfad versuchst Du denn anzusprechen und bist Du auch sicher, dass die Datei existiert. Bei mir funktioniert das alles einwandfrei.
wie meinst du das welchen Pfad ich ansprechen will ??
und ja die datei existiert definitiv ;)
was verwendest du ?? iMac ?? Safari ? windows ??
ich habe einen MacBook mit Safari und da gehts leider nicht ....
BlackJack

@Kalysto: Um Prozesse an Ports kleiner 1024 zu binden braucht man root-Rechte und sowohl 777 als auch 666 sind kleiner als 1024. Das hat also sehr wohl etwas mit root-Rechten zu tun.

Die Zeilen 7 und 17 sind falsch eingerückt. Das sind Syntaxfehler.

Erst Dateiname und dann Pfad ist komisch. Erwarten würde man Pfad und dann den Dateinamen.

Was ist ein direkter Pfad? Du bastelst *absolute* Pfade, womit es wie schon gesagt passieren kann, das der Anwender Dateien auslesen kann, die er ganz sicher nicht auslesen dürfen sollte. Und schon gar nicht mit einem Serverprozess der mit root-Rechten läuft. Normalerweise hat man die Dateien alle unterhalb eines bestimmten Pfades liegen und lässt den Benutzer nur relativ zu diesem Pfad auf Dateien zugreifen und prüft auch ob er nicht versucht durch relative Pfadangaben wie '..' da nach ”oben auszubrechen”. Genau dafür ist `send_from_directory()` ja eigentlich da. Das erste Argument ist dieses Basisverzeichnis in dem Dateien, oder auch Verzeichnisstrukturen liegen die der Anwender lesen darf, und das zweite Argument ist der Dateiname relativ zu diesem Basisverzeichnis. Nur das Du das durch dein Basisverzeichnis, das komplett vom Benutzer vorgegeben werden kann und vom Wurzelverzeichnis ausgeht, wieder aushebelst. Ganz blöde Idee.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Um Prozesse an Ports kleiner 1024 zu binden braucht man root-Rechte und sowohl 777 als auch 666 sind kleiner als 1024. Das hat also sehr wohl etwas mit root-Rechten zu tun.
okey das war mir neu mit den root rechten... gut aber die brauch er ja auch damit er sie lesen kann die datein.
Die Zeilen 7 und 17 sind falsch eingerückt. Das sind Syntaxfehler.
das ist vllt durch das Kopieren passiert in meiner datei passt dies.

und danke das mit den Pfaden kann ich noch abändern das sollte ich hin bekommen ;)
was aber so gesehen nicht mein eigentliches Problem war ....

es geht ja einmal darum das ich keine Videos Streamen kann
und das dann mit dem Downloaden von Liedern aufem iPhone .....

weis dazu wer noch etwas ;)
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalysto: zum Lesen von Dateien braucht man keine root-Rechte. Wenn Du ein Problem mit einem Programm hast, dann solltest Du auch einen Ausschnitt zeigen, der auch das Problem hat. Das was Du gezeigt hast, funktioniert, nach Verbesserung der offensichtlichen Fehler, prinzipiell.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

das das da oben Funktioniert weis ich ja weil ich das bereits getestet habe ....
mein Problem ist einfach das wenn ich nun einen Pfad einer .mp4 datei angeben also eines videos und den dementsprechenden video tag verwende wird das video nicht abgespielt und bekomme auch keine Fehler ausgabe ...

genauso wenn ich nun versuche am iPhone etwas herunterzuladen was am PC klappt geht auf dem iPhone nicht und es gibt auch keine Fehler ausgabe .....
das ist ja mein Problem das ich da nichts Genaus zu sagen kann da ich keine Fehler genannt bekomme .... leider
BlackJack

@Kalysto: Das scheinen dann aber Probleme auf Clientseite zu sein die man am Server nicht fixen kann.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Ich hab's nun in Erfahrung gebracht ....
Für iOS iMac etc. müssen die Videos h264 sein sonst kann er diese nicht wieder geben...

Nun weis ich nicht wie ich diese umwanden kann gibt's da für Python ein Tool welches dieses Format unterstützt und auch umwandeln kann ??


Zu dem Pfad nochmal ich habe eine SQL Datenbank in Der die Pfade schon so drine stehen.
Nun eine Frage für die Sicherheit wo ihr angesprochen habt reicht es wenn ich nun nicht den kompletten Pfad an den Browser weiter leite sondern ihn in PHP so abändere das nur ein Teil weiter gegeben wird bis auf den Teil der in Python Flask angegeben wurde oder soll ich den Eintrag in die dB schon abändern ??
Hoffe das war verständlich;)

Danke schon mal
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalysto: normalerweise benutzt man relative Pfade, da muß man dann nichts abändern. Was hat das jetzt mit PHP zu tun und was steht in welcher Datenbank warum?
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Okey Danke dann muss ich das ändern.
Mit PHP / Html hat das so viel zu weil ich das ganze dort an einen Button gehängt habe mit den entsprechenden links sprich den kompletten Pfad + filename

In der SQL DB liegen die ganzen Pfade und weitere Daten für meine Page aber dann ändere ich dies ab und muss nichts ändern wie du sagtest ;)
BlackJack

@Kalysto: In Python selbst gibt's sicher nichts für H.264, aber bestimmt Anbindungen an entsprechende Bibliotheken. Die von ``ffmpeg`` oder vielleicht auch via GStreamer. Allerdings will man die Konvertierung eher nicht ”live” machen, denn die Kodierung ist recht CPU-intensiv.

Nun bin ich allerings in die andere Richtung neugierig: Wenn Du schon eine Webanwendung in PHP programmierst, warum dann jetzt Python und Flask? Ist ja nicht so dass man in PHP kein HTML mit <video>- und <audio>-Elementen ausliefern könnte und den Webserver dann die Daten direkt ausliefern lassen kann.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Sirius3 hat geschrieben:@DasIch: Streams sind auch einfach nur Dateien, da braucht der Server nichts spezielles können.
Grundsätzlich hast du natürlich recht aber bei Videos nutzen Browser HTTP Range Requests um ein Video in kleineren Stücken zu bekommen oder um im Video zu einer bestimmten Stelle zu springen ohne das Video bis an diese Stelle herunterzuladen.

Wenn ein Server damit Probleme hat, fällt dass in der Regel nicht sofort auf weil man Range Requests nicht so häufig verwendet außer man macht was mit Videos.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

@BlackJack Okey alles klar werde ich mir mal anschauen ;)
Und das ist mir bewusst das man soetwas nicht live macht.
Weist du zufällig ob sich da Qualitativ etwas ändern würde ??

Naja das ist ganz einfach ich verwende das auf einem Synology NAS und die html / PHP Geschichte wird als http/http Benutzer ausgeführt und hat somit keine lese rechte etc. Weil ich dem http Benutzer auch keine Rechte gewähren möchte wollte ich das so über flask lösen weil ich dachte das dies die beste Lösung ist ;)
Das ist der Hintergrund :)
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalysto: [ironie]mit einem weiteren Server, der Zugriff auf ALLES hat, bekommt man Sicherheitsprobleme sicher gelöst.[/ironie] Da Deine Videos und Musik sowieso übers Netz erreichbar sind, ist das einfachste, Du gibst dem User http das Recht diese Dateien zu lesen.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Das ist bei der syno So ne Sache wenn die datein nicht die passenden Rechte hat dann geht es dementsprechend auch nicht ....
Und da ich die Videos extern runterlade kann ich die Rechte nicht beeinflussen
Deswegen hab ich das mit flask gemacht weil das einfacher ist
Sirius3
User
Beiträge: 17703
Registriert: Sonntag 21. Oktober 2012, 17:20

@Kalysto: ich kann kaum glauben, dass Dein NAS keine Möglichkeit hat, Daten per Web öffentlich zugänglich zu machen. Denn genau das meinte ich ja, gib den Dateien die entsprechenden Rechte, da Du ja sowieso willst, dass man die Dateien herunterladen kann.
Kalysto
User
Beiträge: 117
Registriert: Freitag 14. April 2017, 15:28

Ja klar ist das möglich aber dann müsste ich diese unter dem Web Order bereit stellen welche für diesen benutz extra vorhanden ist
Aber ich habe die Lieder Videos etc. nicht in diesem Ordner liegen weil ich die da nicht haben möchte....
Ich hatte alles versucht es geht zwar ja aber dann nur mittels chmod Auf die Datei und das möchte ich nicht .... zudem ich jede neue Datei dann mit chmod bearbeiten müsste...
Anders konnte ich selbst es nicht lösen muss ich dazu sagen
Also ändere ich nun lieber meine Pfade ab sodass ich nur noch relative Pfade habe anstatt absolut Pfade und dann sollte das mit der Sicherheit passen nehme ich an ?
Antworten