Flask Update request wird leer überschrieben

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

Hallo,

ich baue eine Datenbank, welche ich mit der request.form/request.files mit daten fülle.
Dabei bleiben beim "Updaten" der DB-Postionen ohne Veränderung die Daten erhalten.
Beim request.files wird dies allerdings auch leer überschrieben und ich verstehe nicht warum, da der Code für die anderen Stellen genau gleich aufgebaut ist.
Aufbau:

Code: Alles auswählen

class HPLCMETHODS(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(100))
    eluent = db.Column(db.String(500))
    column = db.Column(db.String(500))
    comment = db.Column(db.String(500), nullable = True)
    temperatur = db.Column(db.String(500), nullable = True)
    flow = db.Column(db.String(500), nullable = True)
    mitarbeiter = db.Column(db.String(500), nullable = True)
    retentiontime = db.Column(db.String(500), nullable = True)
    gerät = db.Column(db.String(500), nullable = True)
    data = db.Column(db.LargeBinary)

    def __init__(self, name, eluent, column, comment, temperatur, flow, retentiontime, mitarbeiter, gerät, data):
        self.name = name
        self.eluent = eluent
        self.column = column
        self.comment = comment
        self.temperatur = temperatur
        self.flow = flow
        self.retentiontime = retentiontime
        self.mitarbeiter = mitarbeiter
        self.gerät = gerät
        self.data = data
new:

Code: Alles auswählen

    if request.method == 'POST':
        if not request.form['name'] or not request.form['eluent'] or not request.form['column']:
            flash('Alle Felder beachten.', 'error')
        else:
            hplcmethod = HPLCMETHODS(request.form['name'], request.form['eluent'], request.form['column'], request.form['comment'], request.form['temperatur'], request.form['flow'], request.form['retentiontime'], request.form['mitarbeiter'], request.form['gerät'], request.files['inputFile'].read())
und im Update, dann der Fehler aber eben nur bei den .files, der Rest läuft wie gewünscht.

Code: Alles auswählen

def update(id):
    method_update = HPLCMETHODS.query.get_or_404(id)
    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']
        file = request.files['inputFile'].read()
        method_update.data = file
        try:
            db.session.commit()
            flash("Methode bearbeitet")
            return redirect(url_for('show_all'))
Was genau übersehe ich hier?
Grüße
Karlirex
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Karlirex: Die `db.Model.__init__()` wird nicht aufgerufen. Brauchst Du denn überhaupt unbedingt eine eigene `__init__()`?
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Die brauche ich, würde ich sagen, für den Punkt im Code:

Code: Alles auswählen

@app.route('/search', methods=['GET', 'POST'])
def search():
    if request.method == 'POST':
        form = request.form
        search_value = form['search_string']
        search = "%{}%".format(search_value)
        results = HPLCMETHODS.query.filter(or_(HPLCMETHODS.name.like(search), HPLCMETHODS.eluent.like(search), HPLCMETHODS.column.like(search), HPLCMETHODS.comment.like(search), HPLCMETHODS.mitarbeiter.like(search), HPLCMETHODS.gerät.like(search))).all()
        flash(search_value)
        return render_template('show_all.html', HPLCMETHODS = results)
    else:
        return redirect('/')
falls das nicht stimmen sollte, was würde man oben denn verwenden? und ist das bereits der Fehelr, weshalb das Update leer überschrieben wird in Sachen request.files?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Karlirex: Wo genau wird denn *da* Deine `__init__()` verwendet? Die wird an anderer Stelle in von Dir gezeigtem Code verwendet, aber den kannst Du durch einen Aufruf der schon *vorhandenen* `__init__()` ersetzen. Du kannst da dann halt nur Schlüsselwortargumente verwenden, statt Positionsargumente. Aber letztlich würdest Du das ja wohl auch machen wenn Du in *Deiner* `__init__()` die von der Basisklasse aufrufst.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

@__blackjack__: ja was denn nun? wird sie verwendet oder nicht? Ich hab das so verstanden, dass sie durch das .name/.eluent...verwendet wird.
Aber das scheint ja nicht der Fall zu sein.
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Karlirex: Vielleicht solltest Du mal die Grundlagen von Klassen durcharbeiten bevor Du welche schreibst. Warum hast Du denn eine `__init__()` geschrieben und wann denkst Du denn wird diese Methode aufgerufen? Und macht Dir den Unterschied zwischen Attributen auf der Klasse und auf einem konkreten Exemplar klar. Dein zuletzt gezeigter Code greift auf die Attribute auf der Klasse zu. Deine `__init__()` und die `update()`-Funktion greifen auf die Attribute auf dem Exemplar zu. Auf der Klasse sind Objekte die die Spalten beschreiben, auf den Exemplaren Datensätze aus der Datenbank, oder solche die dort gespeichert werden sollen.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Klassen werden klassischerweise nur in CamelCase geschrieben. Beschreibt ein Eintrag wirklich mehrere Methoden? Oder sollte die Klasse (und die Tabelle) nicht besser HplcMethod heißen?
Bei Vererbung muß man immer die __init__ der Elternklasse explizit im eigenen __init__ aufrufen. Das tust Du nicht. Deine __init__ macht aber eh nichts, was nicht schon die db.Model.__init__ tun würde, weshalb Du sie ganz weglassen kannst.

Code: Alles auswählen

class HplcMethods(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(100))
    eluent = db.Column(db.String(500))
    column = db.Column(db.String(500))
    comment = db.Column(db.String(500), nullable = True)
    temperatur = db.Column(db.String(500), nullable = True)
    flow = db.Column(db.String(500), nullable = True)
    mitarbeiter = db.Column(db.String(500), nullable = True)
    retentiontime = db.Column(db.String(500), nullable = True)
    gerät = db.Column(db.String(500), nullable = True)
    data = db.Column(db.LargeBinary)
Dsa Erzeugen sieht dann natürlich so aus:

Code: Alles auswählen

hplcmethod = HplcMethods(
    name=request.form['name'],
    eluent=request.form['eluent'],
    column=request.form['column'],
    comment=request.form['comment'],
    temperatur=request.form['temperatur'],
    flow=request.form['flow'],
    retentiontime=equest.form['retentiontime'],
    mitarbeiter=request.form['mitarbeiter'],
    gerät=request.form['gerät'],
    data=request.files['inputFile'].read()))
Was komisch ist, dass sowohl temperatur, als auc retentiontime Strings sind, das sollten Zahlen bzw. Zeiten sein. Bei eluent, column, oder flow kann ich nicht sagen, ob das richtig ist. mitarbeiter oder gerät sollten vielleicht IDs auf andere Tabellen sein.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

@__blackjack___: ich habe ehrlicherweise "nur" das Tutorial von Corey Schafer bzgl Flask und SQLAlchemy nachgebaut und für meine Punkte ergänzt/verändert. Zu dem Punkt mit dem "was willst Du tun" und lese dich doch mal in Vererbung etc ein, ist irgendwie so das Problem, dass gefühlt jedes Beispiel dazu eben nur ein Beispiel ist und man auch jeden Weg 5x nach Rom gehen kann für das selbe Ziel.

Hat die __init__() denn wirklich die Auswirkung auf die ursprüngliche Problemfrage bzgl des files in der /update ?

@Sirius3: Was genau meinst du mit auf IDs in anderen Tabellen verweisen? Das es bspw eine Tabelle gibt mit: 1: Paul, 2: Peter, 3: Anna und ich dann in der HplcMethod-Tabelle nur eine 1 eingebe und die DB dann Paul speichert und diese im Webframework ausgibt? Ist das nicht etwas "viel", da man dem User keine sonderliche Erleichterung bietet, aber mehr Code bräuchte? Und um ggf. später das ganze mehr als "Ordnerstruktur" anzeigen zu lassen, sollte es für einen Mitarbeiter 3 Namen(Substanzen) geben oder so, kann man dann ja auch auf den Mitarbeiter verweisen und nicht auf ne zusätzliche ID, welcher der ersten ID(Eintrag der DB) abweichend ist oder?
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Zusätzlich zu einer Einführung in Python würde ich Dir dann noch eine Einführung in relationale Datenbanken empfehlen, insbesondere die Kapitel zu Normalisierung. Dadurch dass Du SQLAlchemy verwendest, ist so eine Indirektion nicht wirklich komplexer.
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

Karlirex hat geschrieben: Montag 12. Juli 2021, 13:03 @__blackjack___: ich habe ehrlicherweise "nur" das Tutorial von Corey Schafer bzgl Flask und SQLAlchemy nachgebaut und für meine Punkte ergänzt/verändert. Zu dem Punkt mit dem "was willst Du tun" und lese dich doch mal in Vererbung etc ein, ist irgendwie so das Problem, dass gefühlt jedes Beispiel dazu eben nur ein Beispiel ist und man auch jeden Weg 5x nach Rom gehen kann für das selbe Ziel.
Solche Beispiele sollen demjenigen, der sich die Grundlage einer Programmiersprache erarbeitet und sie verstanden hat, demonstrieren, wie bestimmte Dinge -- etwa APIs und Frameworks -- benutzt werden.Sie sind nicht dazu gedacht, den Code zu kopieren und daran herumzubasteln, ohne diese genannten Grundlagen verstanden zu haben.

Versteh' mich bitte nicht falsch, ich verstehe das schon: man hat eine tolle Idee, überlegt wie man sie lösen kann, und findet dann ein Tutorial in einer Programmiersprache, die einem bis dato unbekannt ist. Da ist die Versuchung natürlich groß, sich einfach mal schnell den Code aus dem Tutorial zu nehmen und daran herumzuprokeln, ohne eigentlich so ganz genau zu wissen, was man da tut. Aber das ist ein ziemlich sicheres Rezept, früher oder später zu scheitern.
Karlirex hat geschrieben: Montag 12. Juli 2021, 13:03 @Sirius3: Was genau meinst du mit auf IDs in anderen Tabellen verweisen? Das es bspw eine Tabelle gibt mit: 1: Paul, 2: Peter, 3: Anna und ich dann in der HplcMethod-Tabelle nur eine 1 eingebe und die DB dann Paul speichert und diese im Webframework ausgibt? Ist das nicht etwas "viel", da man dem User keine sonderliche Erleichterung bietet, aber mehr Code bräuchte? Und um ggf. später das ganze mehr als "Ordnerstruktur" anzeigen zu lassen, sollte es für einen Mitarbeiter 3 Namen(Substanzen) geben oder so, kann man dann ja auch auf den Mitarbeiter verweisen und nicht auf ne zusätzliche ID, welcher der ersten ID(Eintrag der DB) abweichend ist oder?
Bitte lies diesen [1] Artikel in der Wikipedia. Viel Erfolg!

[1] https://de.wikipedia.org/wiki/Normalisi ... Datenbank)
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

LukeNukem hat geschrieben: Montag 12. Juli 2021, 14:07
Karlirex hat geschrieben: Montag 12. Juli 2021, 13:03 @__blackjack___: ich habe ehrlicherweise "nur" das Tutorial von Corey Schafer bzgl Flask und SQLAlchemy nachgebaut und für meine Punkte ergänzt/verändert. Zu dem Punkt mit dem "was willst Du tun" und lese dich doch mal in Vererbung etc ein, ist irgendwie so das Problem, dass gefühlt jedes Beispiel dazu eben nur ein Beispiel ist und man auch jeden Weg 5x nach Rom gehen kann für das selbe Ziel.
Solche Beispiele sollen demjenigen, der sich die Grundlage einer Programmiersprache erarbeitet und sie verstanden hat, demonstrieren, wie bestimmte Dinge -- etwa APIs und Frameworks -- benutzt werden.Sie sind nicht dazu gedacht, den Code zu kopieren und daran herumzubasteln, ohne diese genannten Grundlagen verstanden zu haben.

Versteh' mich bitte nicht falsch, ich verstehe das schon: man hat eine tolle Idee, überlegt wie man sie lösen kann, und findet dann ein Tutorial in einer Programmiersprache, die einem bis dato unbekannt ist. Da ist die Versuchung natürlich groß, sich einfach mal schnell den Code aus dem Tutorial zu nehmen und daran herumzuprokeln, ohne eigentlich so ganz genau zu wissen, was man da tut. Aber das ist ein ziemlich sicheres Rezept, früher oder später zu scheitern.
Karlirex hat geschrieben: Montag 12. Juli 2021, 13:03 @Sirius3: Was genau meinst du mit auf IDs in anderen Tabellen verweisen? Das es bspw eine Tabelle gibt mit: 1: Paul, 2: Peter, 3: Anna und ich dann in der HplcMethod-Tabelle nur eine 1 eingebe und die DB dann Paul speichert und diese im Webframework ausgibt? Ist das nicht etwas "viel", da man dem User keine sonderliche Erleichterung bietet, aber mehr Code bräuchte? Und um ggf. später das ganze mehr als "Ordnerstruktur" anzeigen zu lassen, sollte es für einen Mitarbeiter 3 Namen(Substanzen) geben oder so, kann man dann ja auch auf den Mitarbeiter verweisen und nicht auf ne zusätzliche ID, welcher der ersten ID(Eintrag der DB) abweichend ist oder?
Bitte lies diesen [1] Artikel in der Wikipedia. Viel Erfolg!

[1] https://de.wikipedia.org/wiki/Normalisi ... Datenbank)
Also jetzt mal ehrlich, wer von nicht studierten oder nicht ausgebildeten IT-Leuten hier hat das denn wirklich gemacht? Sich komplett in alles eingelesen.
Aber ich verstehe, man muss erstmal jemandem zeigen, wie dumm er ist, damit man sich besser fühlt. Keine der Antworten ist auf das Problem eingegangen. Jeder Kommentar war nur dazu, "Deine DB könnte man so programmieren", "Das schreibt man so", warum aber wirklich dieser Fehler auftritt hat keine der Antworten beantwortet.
Das hat nämlich nicht mal etwas damit zutun, wie bei nem Arzt der nen Lungenkranken Raucher behandelt sagt er solle aufhören zu rauchen statt ihm die Lunge zu "reparieren", sondern ihm auch noch sagt "sie sollten sich auch mal ins Thema Chirugie einlesen", das hab ich ja schließlich auch getan.
Dann google ich mir die Sachen wieder zusammen und brings ans laufen. Dafür, dass das keine Kundenprojekte oder ähnliches sind, wirds das iwie tun.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dir ist doch die Antwort gegeben worden: die db.Model.__init__ wird nicht aufgerufen. Das hast du halt in Zweifel gezogen, statt es einfach mal auszuprobieren.

Und dein Vergleich hinkt so gewaltig wie ein beinamputierter Raucher. Denn der Chirurg macht seine Arbeit, und der Raucher raucht halt. Aber hier redet man von Chirurg zu Chirurg, um bei deinem Beispiel zu bleiben. Und wenn der erfahrene Chirurg einem sagt "die Aortenklemme, die muss aber schon dran", dann kann man das einfach auch mal machen. Oder man fragt halt 3mal nach, ob das denn jetzt *wirklich* notwendig waere, und dann ist der Patient halt tot. Ist aber nicht die Schuld vom Kollegen...
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

@__deets__: okay. aber wenn diese in keinem der Fälle aufgerufen wird, erklärt es doch nicht, warum das Updaten, sowie behalten bei den request.forms richtig funktioniert und request.files beim update ein leeres Feld zurückgibt, statt dieses zu behalten, wie eben bei den forms auch oder?
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Und wenn ich einmal die __init__ entferne oder durch __repr__ ersetze, dann passiert nämlich nichts bzw. lande ich hier:

Code: Alles auswählen

hplcmethod = HPLCMETHODS(request.form['name'], request.form['eluent'], request.form['column'], request.form['comment'], request.form['temperatur'], request.form['flow'], request.form['retentiontime'], request.form['mitarbeiter'], request.form['gerät'], request.files['inputFile'].read())
In der Fehlermeldung, dass Argumente fehlen, also wird sie ja dort scheinbar gebraucht und aufgerufen.
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

Karlirex hat geschrieben: Montag 12. Juli 2021, 15:52
LukeNukem hat geschrieben: Montag 12. Juli 2021, 14:07 Solche Beispiele sollen demjenigen, der sich die Grundlage einer Programmiersprache erarbeitet und sie verstanden hat, demonstrieren, wie bestimmte Dinge -- etwa APIs und Frameworks -- benutzt werden.Sie sind nicht dazu gedacht, den Code zu kopieren und daran herumzubasteln, ohne diese genannten Grundlagen verstanden zu haben.
Also jetzt mal ehrlich, wer von nicht studierten oder nicht ausgebildeten IT-Leuten hier hat das denn wirklich gemacht? Sich komplett in alles eingelesen.
Entschuldige bitte, aber ich fürchte, wir reden gerade an einander vorbei. Das sieht man schon an den Formulierungen: wo ich von "den Grundlagen" spreche, machst Du gleich "alles" daraus. Und ja, wenn ich mit einer Programmiersprache arbeiten möchte, dann lese ich mich schon ein, wie die Syntax, die Grammatik und ihre wesentlichen Grundlagen funktionieren.
Karlirex hat geschrieben: Montag 12. Juli 2021, 15:52 Aber ich verstehe, man muss erstmal jemandem zeigen, wie dumm er ist, damit man sich besser fühlt.
Ja, wir reden an einander vorbei. Ich habe versucht, Dir das möglichst freundlich zu verdeutlichen, weil ich genau das, was Du mir frech unterstellst, gerade NICHT bezweckt habe.
Karlirex hat geschrieben: Montag 12. Juli 2021, 15:52 Keine der Antworten ist auf das Problem eingegangen. Jeder Kommentar war nur dazu, "Deine DB könnte man so programmieren", "Das schreibt man so", warum aber wirklich dieser Fehler auftritt hat keine der Antworten beantwortet.
Daß es dafür einen anderen Grund geben könnte, als Dich zu düpieren, kommt Dir aber anscheinend nicht in den Sinn, oder? Schau, einige -- vermutlich viele -- von uns machen dieses Programmierzeugs schon ziemlich lange und haben auch so unsere Erfahrungen mit Fragen wie Deiner. Deswegen erkenne nicht nur ich, sondern wohl auch andere an Deiner Fragestellung einige sehr grundlegene Verständnisprobleme.

Natürlich könnten wir auf Dein konkretes Problem eingehen, und zum Beispiel __blackjack__ hat das in seinen ersten beiden Beiträgen ja auch getan. Aus Deinen Antworten ergibt sich leider: Du kannst seine Hinweise nicht verstehen, weil Dir die Grundlagen egal sind -- und weil Du fälschlicherweise zu erwarten scheinst, daß wir unsere wertvolle Freizeit dazu opfern müssen, um Deine Hausaufgaben zu machen und Dir Grundlagen zu erklären, die Du Dir längst selbst hättest erarbeiten können. Nein, sollen. Nein: MÜSSEN! Dank Internet ist der Wissenserwerb heute so einfach wie nie zuvor, probier's mal aus!

Übrigens steigert es meine Motivation, Dir zu helfen, nicht besonders, wenn Du patzig wirst, die beleidigte Leberwurst gibst, und dann auch noch mit böswilligen Unterstellungen um Dich wirfst.
Karlirex hat geschrieben: Montag 12. Juli 2021, 15:52 Dann google ich mir die Sachen wieder zusammen und brings ans laufen. Dafür, dass das keine Kundenprojekte oder ähnliches sind, wirds das iwie tun.
Na dann... viel Glück. Du wirst es brauchen.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Karlirex hat geschrieben: Montag 12. Juli 2021, 18:31 Und wenn ich einmal die __init__ entferne oder durch __repr__ ersetze, dann passiert nämlich nichts bzw. lande ich hier:

Code: Alles auswählen

hplcmethod = HPLCMETHODS(request.form['name'], request.form['eluent'], request.form['column'], request.form['comment'], request.form['temperatur'], request.form['flow'], request.form['retentiontime'], request.form['mitarbeiter'], request.form['gerät'], request.files['inputFile'].read())
In der Fehlermeldung, dass Argumente fehlen, also wird sie ja dort scheinbar gebraucht und aufgerufen.
Du mußt meine Antwort schon auch komplett lesen. Das kann Dir hier auch niemand abnehmen.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Sirius3 hat geschrieben: Montag 12. Juli 2021, 18:41
Karlirex hat geschrieben: Montag 12. Juli 2021, 18:31 Und wenn ich einmal die __init__ entferne oder durch __repr__ ersetze, dann passiert nämlich nichts bzw. lande ich hier:

Code: Alles auswählen

hplcmethod = HPLCMETHODS(request.form['name'], request.form['eluent'], request.form['column'], request.form['comment'], request.form['temperatur'], request.form['flow'], request.form['retentiontime'], request.form['mitarbeiter'], request.form['gerät'], request.files['inputFile'].read())
In der Fehlermeldung, dass Argumente fehlen, also wird sie ja dort scheinbar gebraucht und aufgerufen.
Du mußt meine Antwort schon auch komplett lesen. Das kann Dir hier auch niemand abnehmen.
Es ändert trotzdem nichts an dem Update-Fehler. Die DB wird da dann weiterhin leer überschrieben, aber eben NUR in dem request.files.....das ergibt für mich eben keinen Sinn.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Aus den Bruchstücken Deines Codes kann man auch nicht wirklich sagen, ob Du alles richtig machst, oder doch noch andere Fehler hast.
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Sirius3 hat geschrieben: Montag 12. Juli 2021, 19:02 Aus den Bruchstücken Deines Codes kann man auch nicht wirklich sagen, ob Du alles richtig machst, oder doch noch andere Fehler hast.

Code: Alles auswählen

from flask import Flask, render_template, request, url_for, redirect, flash, send_file
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import or_
from io import BytesIO

app = Flask(__name__)
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///methoden.db'
app.config['SECRET_KEY'] = "random string"

db = SQLAlchemy(app)

class HPLCMETHODS(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(100))
    eluent = db.Column(db.String(500))
    column = db.Column(db.String(500))
    comment = db.Column(db.String(500), nullable = True)
    temperatur = db.Column(db.String(500), nullable = True)
    flow = db.Column(db.String(500), nullable = True)
    mitarbeiter = db.Column(db.String(500), nullable = True)
    retentiontime = db.Column(db.String(500), nullable = True)
    gerät = db.Column(db.String(500), nullable = True)
    data = db.Column(db.LargeBinary)


@app.route("/")
def show_all():
    return render_template('show_all.html', HPLCMETHODS = HPLCMETHODS.query.all())


@app.route('/new', methods=['GET', 'POST'])
def new():
    if request.method == 'POST':
        if not request.form['name'] or not request.form['eluent'] or not request.form['column']:
            flash('Alle Felder beachten.', 'error')
        else:
            hplcmethod = HPLCMETHODS(name = request.form['name'], eluent = request.form['eluent'], column = request.form['column'], comment = request.form['comment'], temperatur = request.form['temperatur'], flow = request.form['flow'], retentiontime= request.form['retentiontime'], mitarbeiter = request.form['mitarbeiter'], gerät = request.form['gerät'], data = request.files['inputFile'].read())#, data)

            db.session.add(hplcmethod)
            db.session.commit()

            flash('Methode erfolgreich hinzugefügt.')
            return redirect(url_for('show_all'))
    return render_template('new.html')


@app.route('/update/<int:id>', methods=['GET', 'POST'])
def update(id):
    method_update = HPLCMETHODS.query.get_or_404(id)
    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']
        file = request.files['inputFile'].read()
        method_update.data = file
        try:
            db.session.commit()
            flash("Methode bearbeitet")
            return redirect(url_for('show_all'))
        except:
            return "Fehler, versuche es erneut"
    else:
        return render_template('update.html', method_update = method_update)


@app.route('/delete/<int:id>')
def delete(id):
    method_delete = HPLCMETHODS.query.get_or_404(id)
    db.session.delete(method_delete)
    db.session.commit()
    flash('Methode erfolgreich entfernt')
    return redirect(url_for('show_all'))


@app.route('/search', methods=['GET', 'POST'])
def search():
    if request.method == 'POST':
        form = request.form
        search_value = form['search_string']
        search = "%{}%".format(search_value)
        results = HPLCMETHODS.query.filter(or_(HPLCMETHODS.name.like(search), HPLCMETHODS.eluent.like(search), HPLCMETHODS.column.like(search), HPLCMETHODS.comment.like(search), HPLCMETHODS.mitarbeiter.like(search), HPLCMETHODS.gerät.like(search))).all()
        flash(search_value)
        return render_template('show_all.html', HPLCMETHODS = results)
    else:
        return redirect('/')

@app.route('/upload', methods=['POST'])
def upload():
    file = request.files['inputFile']
    hplcmethod = HPLCMETHODS(data=file.read())
    db.session.add(hplcmethod)
    db.session.commit()
    return "Saved" + file.filename

@app.route('/download/<int:id>')
def download(id):
    data = HPLCMETHODS.query.filter_by(id=id).first()
    id_string = str(id)
    return send_file(BytesIO(data.data), attachment_filename= id_string, mimetype='image', as_attachment=True)


if __name__ == '__main__':
    db.create_all()
    app.run(debug=True)
Karlirex
User
Beiträge: 126
Registriert: Dienstag 18. August 2020, 18:27

Hm..soviel zum gesamt Code :D
Naja danke euch trotzdem.
Antworten