Flask Update request wird leer überschrieben

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

@sparrow: natürlich gibt es einen zweiten Durchlauf, denn nach dem create ist das update ein zweiter Durchlauf für diese DB Zeile.
Also:
Ich möchte gerne Namen, Eluenten und eben Dateien in einer DB speichern. Diese DB existiert, aber zu dieser wird es keinen lokalen Ordner für Dateien geben. Aus diesem Grund habe ich mich ja für die Bytes-Sache entschieden, da es zumindest was ich so gefunden habe, nur lokale Dateien oder DB Bytes gibt.
Wird der Inhalt in der DB durch create gespeichert enthält diese dann Name, Eluent...und ggf. eine Datei (hier eben als BLOB).
Jetzt möchte ein zweiter PC den Inhalt wie Name, Eluent...bearbeiten (dieser hat die ursprüngliche Datei nicht mehr), dann soll die usprüngliche Datei (also das BLOB) erhalten bleiben.
Danach möchte ich oder ein dritter PC diese Methode nochmal bearbeiten, weil es eine neue "bessere" Datei gibt, also soll die bisherige Datei durch die neue überschrieben werden.
Anschließend lädt irgendeiner der PCs die Datei dann herunter.
Fertig.

Hinweis: Beim Bearbeiten, so wie es ganz am Anfang programmiert ist, bleiben die Punkte Name, Eluent...mit den Werten aus create bestehen (mit dem gleichen Code), deshalb auch der erste Ansatz da einfach das request.files() anzuhängen.

Ich hoffe, ihr versteht nun was da genau passieren soll und das es eben schon für die ersten Punkte passiert.
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Natürlich gibt es keinen zweiten Durchlauf. Ein zweiter Durchlauf suggeriert, dass das nacheinander passiert.
Es gibt ein Create und davon völlig unabhängig ein Update.

Du musst dich mit der Systematik beschäftigen. Und ich bin mir ziemlich sicher, dass es in der Flask-Dokumentation ein ausführliches Beispiel dafür gibt, wie Dateiuploads gehandhabt werden. Ein erster Versuch an google ergab diesen Treffer.

Wenn jemand eine neue Datei uploaded, dann musst du das Feld updaten. Weder musst du das immer tun, noch musst du dafür die alte Datei aus der Datenbank lesen und noch einmal übertragen. Neue Datei -> Update des Feldes. Keine neue Datei -> Kein Update des Feldes.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

@sparrow: NOCHMAL die Doku bringt mir NICHTS, da ich aus einer DATENBANK ohne LOKALEN FILEORDNER arbeite und deshalb ich mit den BYTES arbeiten MUSS.

Den Upload zu prüfen habe ich ja versucht mit dem if request.files! Das läuft er aber jedes Mal trotzdem durch.
Beispielsweise habe ich mir vor dem if == POST eine Überprüfung gesetzt.

Code: Alles auswählen

@app.route('/update/<int:id>', methods=['GET', 'POST'])
def update(id):
    method_update = HPLCMETHODS.query.get_or_404(id)
    data = HPLCMETHODS.query.filter_by(id=id).first()
    old_file = data.data
    print(old_file)
    if request.method == 'POST':
        method_update.name = request.form['name']
        method_update.eluent = request.form['eluent']
        method_update.column = request.form['column']
        method_update.comment = request.form['comment']
        method_update.temperatur = request.form['temperatur']
        method_update.flow = request.form['flow']
        method_update.mitarbeiter = request.form['mitarbeiter']
        method_update.retentiontime = request.form['retentiontime']
        method_update.gerät = request.form['gerät']
Diese printed einmal beim auf Update klicken, was ja richtig ist. Submite ich, printed diese allerdings nochmal.
Ich kann also garnichts logisch abfragen, da sie sich vorher und nachher mit den Werten überschreibt und oben nochmal läuft.

und in meiner update-html:

Code: Alles auswählen

 <form action = "{{ request.path }}" method = "post" enctype="multipart/form-data">
          <table>
              <thead>
                <th><label for = "name">Name</label></th>
                <th><label for = "eluent">Eluent</label></th>
                <th><label for = "column">Säule</label></th>
                <th><label for = "comment">Kommentar</label></th>
                <th><label for = "temperatur">Temperatur [°C]</label></th>
                <th><label for = "flow">Fluss [ml/min]</label></th>
                <th><label for = "retentiontime">Retentionszeit [min]</label></th>
                <th><label for = "mitarbeiter">Mitarbeiter</label></th>
                <th><label for = "gerät">Gerätename</label></th>
                <th><label for = "data">Datei</label></th>
              </thead>

              <tbody>
                <td><input type = "text" name = "name" placeholder = "Name" value = "{{ method_update.name }}" /></td>
                <td><input type = "text" name = "eluent" placeholder = "Eluent" value = "{{ method_update.eluent }}" /></td>
                <td><input type = "text" name = "column" placeholder = "Säule" value = "{{ method_update.column }}" /></td>
                <td><input type = "text" name = "comment" placeholder = "Kommentar" value = "{{ method_update.comment }}" /></td>
                <td><input type = "text" name = "temperatur" placeholder = "Temperatur" value = "{{ method_update.temperatur }}" /></td>
                <td><input type = "text" name = "flow" placeholder = "Fluss" value = "{{ method_update.flow }}" /></td>
                <td><input type = "text" name = "retentiontime" placeholder = "Retentionszeit" value = "{{ method_update.retentiontime }}" /></td>
                <td><input type = "text" name = "mitarbeiter" placeholder = "Mitarbeiter" value = "{{ method_update.mitarbeiter }}" /></td>
                <td><input type = "text" name = "gerät" placeholder = "Gerätename" value = "{{ method_update.gerät }}" /></td>
                <td>
                        <input type="file" name="inputFile" value = "{{ method_update.data }}" />
                </td>
                <td><input type = "submit" value = "Bearbeiten" /></td>
Bleiben damit eben die text-inputs stehen nur die File eben nicht, auch bei dem einfachen Post, wo ich alles überschreibe, weil die eben da drin stehen bleiben.
Benutzeravatar
sparrow
User
Beiträge: 4164
Registriert: Freitag 17. April 2009, 10:28

Ich bin beeindruckt, mit welcher Geschwindigkeit du den Inhalt des Links gelesen hast. Sicher so schnell, dass du überlesen hast, wie dort beschrieben wird, wie man erkennt, ob der User eine Datei ausgewählt hat. 8)
Denn dem Request und dem Upload ist egal, ob die Datei in eine Datei oder in eine Datebank geht.
Dir ist schon klar, dass das zwei verschiedene Dinge sind? Und dass dein Problem an der Seite hängt, wo du Sachen hoch lädst und nicht an der wie du speicherst? Auch wenn du in eine Datei schreiben würdest, hättest du das selbe Problem.
Du musst herausfinden, ob der Anwender eine Datei hochlädt oder nicht.
Das habe ich nun ja auch in meinem vorherigen Post geschrieben. Wenn du denkst, dass das anders gehen muss: Viel Glück.

Um das Lesen und Lernen wirst du nicht herum kommen. Das nimmt dir niemand ab.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

@sparrow: ich gebe zu ich hab das überlesen, ich konnte für mich nichts mit dem .filename nichts anfangen, dachte ich will ja nicht den filename speichern.
Ich bedanke mich für deine Geduld und werde mich etwas mehr in Dokus lesen bzw. teile dieser ."Befehle" öfter googlen, denn das hätte hier schon wahrscheinlich früher gereicht, da ich über das .filename nicht gerade erst gestolpert bin.

Vielen Dank an eure Hilfe und auch für die Geduld, macnhmal ein kleiner *Holzkopf*

Grüße
Karlirex
Antworten