Flask absolute directory path

Django, Flask, Bottle, WSGI, CGI…
Antworten
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Hallo zusammen,

ich möchte eine Flask-App erstellen, die Dateien aus kompletten Ordnern (welchen man auswählen kann) verschiebt.
Dazu wollte ich die Auswahl im Browser durchführen lassen. Leider kann ich nur ganze Dateien auswählen, keine kompletten Ordner, und erhalte zusätzlich nur den jeweiligen Dateinamen. Ich könnte also auch nicht um den Pfad herumspielen.

Bisher sieht mein Programm so aus:

Code: Alles auswählen

from Backend import app
from flask import request, render_template

@app.route("/", methods=['GET', 'POST'])
def get_url():
    if request.method == 'POST':
        folderpath = request.files.getlist('filetest')
        print(folderpath)
    return render_template("get_url.html")

if __name__ == '__main__':
    app.run()
HTML:

Code: Alles auswählen

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>Upload new File</h1>
    <form action = "{{ request.path }}" method="post" enctype="multipart/form-data">
      <input type="file" name="filetest">
      <input type="submit" value="Upload">
    </form>
</body>
</html>
Bei meiner Recherche hab ich noch das html input-Attribute "multiple" gefunden, dass lässt aber ebenfalls nur mehr Dateien und keine Ordner zu.
Nach der Auswahl der Ordner soll dann eben weiter gemacht werden, mit evtl. watchdogs o.ä. um automatisch verschiedene Ordner zu überwachen.
Das ganze könnte man auch "einfacher" direkt mit watchdogs und normalem Pythonskript ausführen, leider fehlt mir da die grafische Aufarbeitung, für mögliche Produktionsziele doch recht wichtig ist.

Vielleicht kennt ja jemand noch eine Möglichkeit.
Grüße
Karlirex
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Browser darf das nicht. Aus guten Gruenden. Wenn es dir "nur" um eine grafische Oberflaeche auf dem gleichen System geht, kannst du aber natuerlich auch "einfach" das ganze Verzeichnisgehampel in HTML nachbilden, und die eigentlichen Dateioperationen dann vom Server erledigen lassen. Ohne den System-File-Dialog, und die HTML-Dateimechanismen.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Nunja, rein die Verzeichnisse bringen mir dann wenig und es bleibt auch nicht lokal für einen Rechner, sondern sollte dann von jedem anderen Rechner auch so auswählbar sein.
Ich dachte da an Flask, da updates etc darüber ja recht einfach zu verteilen sind, wenn man nur einen Server neustarten muss, als bspw mit PySide auf jedem Rechner das theoretisch neu zu installieren.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn Dein Server nicht lokal läuft, hat der natürlich erst einmal keinen Zugriff auf Deinen Rechner. Kannst Du etwas weiter ausholen, was Du eigentlich erreichen willst?
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

@Sirius3:
es gibt einen File Server bei uns, welcher immer mehr automatisiert werden soll (wissenschaftliche Auswertungen am Ende ggf. direkt aus Rohdaten zu fertigen Plots).
Auf dem Server landen per USB-Stick sämtliche Daten von Messgeräten. Diese Daten sollen im ersten Schritt erkannt werden (hier der Ordner der Überwacht werden soll) und dann zu einem entsprechenden Zielordner kopiert werden. So würde der File Server direkt als Backup der Rohdaten dienen.
Die Idee für Flask dahinter war, dass es so jeder Nutzer speziell seinen Wünschen anpassen kann (was Ziel oder auch Ursprungsordner angeht) und das Skript nicht permanent neu bearbeitet werden muss, weil sich ein besagter Ordner ändert.
Den Teil bzgl der Bewegung der Daten und Übrwachen könnte man dann schätzungsweise mit watchdog umsetzen. Aber die brauchen ja zunächst die Ursprungs-/Zielordner.

Grüße
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Dateien von einem USB-Stick auf ein zentrales Netzwerkverzeichnis zu kopieren ist ja jetzt keine Aufgabe, die man per Flask lösen würde. Ich gehe mal davon aus, dass niemand zum Server hinstiefelt umd dort einfach irgendwelche USB-Sticks einzustöpseln.
Wenn man eh den Zielordner händisch angeben muß, dann hilft einem ja watchdog auch nichts.

Also entweder ist das ein händischer Upload von Daten von USB per HTTP. Dann hilft ja der multiple-file-input, wo man halt alle Dateien angeben muß.
Oder man kopiert mit einem lokalen Programm (copy) Daten auf ein Netzverzeichnis, wo auch Dein Flask-Server drauf Zugriff hat und dann kannst Du rein auf Serverseite alles mit den Daten machen.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Nunja watchdog würde einem für den letzten Schritt doch schön weiterhelfen, da ich doch dann prüfen kann wenn neue Daten im Netz ankommen, diese dann direkt auch weiter zu verschieben, oder?
Und dennoch müsste ich dann bei Flask irgendwie den Zielordner mitgeben, selbst wenn ich den Ursprungsordner kenne und bei watchdog abfange.

Ich möchte eben nicht für jeden Nutzer diese Ordnerpfad eingabe tätigen müssen, wenn sich ein Pfad ändert oder ein neuer Nutzer dazukommt, deshalb die Idee mit Flask, wo dies jeder Nutzer selbst kann.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Da mußt Du nochmal weiter ausholen. Wie erkennst Du, welche Daten für welchen Nutzer sind?
Entweder ist es der Nutzer selbst, der angeben muß, wohin die Daten kommen sollen, aber dann brauchst Du kein watchdog, denn in dem Moment, wo der Nutzer sagt, wohin, schaust Du einfach, welche Daten am Quellort liegen.
watchdog ist doch nur dann nötig, wenn keine Nutzerinteraktion gebraucht wird.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Im Normalfall werden die Messdaten mit einem Kürzel hinterlegt: Datum_Bezeichnung_Name(Kürzel). Gleichzeitig werden die Daten auf dem Server immer nur in den entsprechenden Nutzerordner gepackt.
Ab hier kommt dann die Idee. Ab Nutzerordner könnte er dann ggf. in der Bezeichnung feststehenden Namenszusatz angeben, wohin Daten mit Zusatz A geleitet werden (mit Zusatz B,... genauso). Einmal eingetragen wird dann der Ordner überwacht und sobald neue Messdaten hochgeladen werden in den Nutzerordner, werden die automatisch an den, vom Nutzer, gewünschten Ordner geschoben.

So die erste Idee.
In einem späteren Schritt könnte man dann ggf. die Dateien aus dem gewünschten Ordner öffnen und die Messdaten "grob"/einheitlich mittels matplotlib bspw. direkt noch verarbeiten und den jeweiligen Plot dann ggf. auch wieder in einem "processed data" Ordner abspeichern lassen (oder ne gesammelte csv erstellen).
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mir ist immer noch unklar, was da wer wie von welchem Rechner aus wohin kopiert. Aber ganz allgemein wuerde ich heutzutage keinen Fileserver mehr einsetzen, wenn's nicht unbedingt sein muss. Sowas wuerde ich sofort als Webanwendung bauen, die durch den Login, und den Upload-Zeitpunkt schon zwei deiner drei Kriterien abfruehstueckt. Bezeichnung kann erzwungen werden, und auch irgendwelches FS-Monitoring entfaellt, denn wenn die Daten oben sind, kann das ganze in die Prozess-Pipeline gestopft werden. Auch die Darstellung der Ergebnisse kann basierend auf dieser app passieren, etc.

Filesysteme sind schlechte APIs. Wenn es keinen zwingenden Grund gibt, eines zu benutzen, sollte man eine echte API (in diesem Fall via HTTP/REST) vorziehen.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Der FileServer ist bei uns schon ewig da und wird eben von mehreren Gruppen verwendet, weshalb da alles drauf geht.
Jetzt ist eben meine Idee, dies zumindest für unsere Gruppe zu vereinfachen und im best case automatisieren.
Das Hochladen per Webanwendung würde die Daten dann aber nur der Person zu ordnen, die die Daten hochlädt und nicht einer dritten, die dann eigentlich damit arbeitet, oder?
Ich glaube, dass das Problem hier liegt, dass die Daten ggf. von mehreren Personen "angefasst" werden um vom Messsystem schlussendlich bearbeitet in irgendeinem Bild zu landen.

vllt nochmal klarer, aktuell:
Messsystem erzeugt Daten --> Daten mittels Person A in Ordner Person X auf Fileserver --> Person X nimmt Daten verschiebt diese zunächst ---> Wertet Daten vereinfacht aus ---> Export neuer Ordner

Den Schritt von Person A wollte ich lassen, aber ab dort soll eben bis zum "fertigen" Export automatisch möglich sein und eben für n Personen mit vorlieben für gf. verschiedene Ordner.

Vielleicht konnte ich so nochmal Unklarheiten lösen.

Danke schonmal für eure Ideen.
Grüße
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das hochladen macht, was du dem hochladen beibringst. Wenn A Daten hochlädt, die für X gedacht sind, dann kann A das ja angeben.
Antworten