Nutzereingabe verarbeiten Flask

Django, Flask, Bottle, WSGI, CGI…
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei `getdata` würde ich nicht erwarten, dass man da Daten schreiben kann. Dateien die geöffnet werden, sollten auch wieder geschlossen werden, am besten mit dem with-Statement arbeiten.
Statt mit einer Zeitzone mit Sommer- und Winterzeit eine nehmen, die das nicht hat, bei Bedarf kann man ja immer noch umrechnen. Du schreibst immer noch für jeden Buchstaben einmal die gesamten Daten. Benutze format:

Code: Alles auswählen

def store_data():
    if request.method == 'POST':
        data = request.data
        current_time = datetime.datetime.utcnow()
        with open('test.txt', "a") as output:
            output.write("{:%Y-%m-%d %H:%M:%S}; {}\n".format(current_dime, data))
    return render_template('getdata.html')
Die if-Blöcke in Daten enthalten zum Großteil identischen Code. Schau mal, was sich da wirklich ändert, speichere das in Variablen und plotte nur an einer Stelle. Dann kannst Du diese variablen Teile in ein Wörterbuch auslagern und sparst die das if komplett. Das return am Ende der Funktion wird nie erreicht. Eine Schnittstelle, die mal HTML und mal PNG liefert, ist schlecht. Trenne die beiden Aufgaben in zwei Funktionen. Im HTML fehlt dazu auch noch das passende <img>-Tag.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Danke für die Tipps der Teil der Datei war noch der alte wo noch in die txt datei geschrieben wird. Deine Tipps werde ich befolgen wenn ich das ganze zu Csv änder, aber erstmal schreibe ich den Teil wo aus der Csv Datei gelesen wird fertig.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Wichtiger für Dein aktuelles Problem ist eigentlich der zweite Teil meiner Antwort.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Das ich das Bild mit <img> einbinden kann in das HTML Dokument hat Blackjack gesagt das es nicht geht.
Bei den if schleifen hab ich versucht data_one bei erdfeuchtigkeit und lux als variabel einzufügen das sie ja eigentlich "lux" als Inhalt haben sollte und somit die oben definierte Liste lux sein sollte aber das ging nicht.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Eine Musterlösung sagt mehr als tausend Worte:

Code: Alles auswählen

PLOTS = {
    'luftfeuchtigkeit': {
        'title': 'Luftfeuchtigkeit',
        'ylabel': 'Luftfeuchtigkeit in %',
        'plots': [('luftfeuchtedrin', 1), ('luftfeuchteausen', 3)]
    },
    'temperatur': {
        'title': 'Temperatur',
        'ylabel': 'Temperatur in °C',
        'plots': [("Temperatur drin", 2), ("Temperatur ausen", 4)]
    },
    'erdfeuchtigkeit': {
        'title': 'Erdfeuchtigkeit',
        'ylabel': 'Erdfeuchtigkeit in %',
        'plots': [('Erdfeuchtigkeit', 5)]
    },
    'lux': {
        'title': 'Lichtitensität',
        'ylabel': 'Lichtitensität in Lux',
        'plots': [('Lichtitensität(lux)', 6)]
    },
}

app = Flask(__name__)

@app.route('/image/<filename>', methods=['GET'])
def daten(filename):
    data_one = filename.split('.')[0]
    with open('data/data.csv') as lines:
        reader = csv.reader(lines, delimiter=',')
        tabelle = [
            row[:1] + [float(c) for c in row[1:]]
            for row in reader
        ]

    time = [zeile[0] for zeile in tabelle]
    plot = PLOTS[data_one]
    fig, ax = plt.subplots()
    for label, idx in plot['plots']:
        ax.plot(time, [zeile[idx] for zeile in tabelle], label=label)
    ax.grid(True)
    fig.legend()
    ax.set_title(plot['title'])
    ax.set_ylabel(plot['ylabel'])
    ax.set_xlabel('Uhrzeit')

    buffer = io.BytesIO()
    plt.savefig(buffer, format = 'png')
    plot_data = buffer.getvalue()

    response = make_response(plot_data)
    response.headers['Content-type'] = 'image/png'
    return response

@app.route('/data', methods=['GET', 'POST'])
def daten():
    if request.method == 'POST':
        data_one = request.form['data_one']
    else:
        data_one = None
    return render_template('benutzer.html', data_one=data_one})

Code: Alles auswählen

{% extends "base.html" %}
{% block content %}
    <h1>Upload new Data</h1>
    <br>
    <form method = "post">
            <div class="row">
                <div class="col-25">
                  <label for="data_one">Messdaten:</label>
                </div>
                <div class="col-75">
                  <select id="data_one" name="data_one">
                    <option value="luftfeuchtigkeit">Luftfeuchtigkeit</option>
                    <option value="temperatur">Temperatur</option>
                    <option value="erdfeuchtigkeit">Erdfeuchtigkeit</option>
                    <option value="lux">Lux</option>
                  </select>
                </div>
            </div>
        <input type = "submit" value = "submit" />
    </form>
{%if data_one %}<img src="/image/{data_one}.png">{%endif%}
{% endblock %}
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Entschuldigung erstmal für die späte Antwort aber ich war im Urlaub. Also der Teil das ganze in ein dict zu speichern geht jetzt sehr gut danke dafür erstmal. Aber der Teil geht nicht da das {data_one} in den Anführungszeichen nicht als Variabel erkannt wird und gibt diesen Fehler in der Konsole aus. Weiß jemand wie ich die Variabel in den Pfad einbinde?

Code: Alles auswählen

{%if data_one %}<img src="/image/{data_one}.png">{%endif%}

Code: Alles auswählen

2018-08-31T20:28:02.110083+00:00 app[web.1]:   File "/app/app.py", line 69, in daten

2018-08-31T20:28:02.110085+00:00 app[web.1]:     plot = PLOTS[data_one]

2018-08-31T20:28:02.110092+00:00 app[web.1]: KeyError: '{data_one}'

2018-08-31T20:28:02.110864+00:00 app[web.1]: 10.102.18.156 - - [31/Aug/2018:20:28:02 +0000] "GET /image/%7Bdata_one%7D.png HTTP/1.1" 500 291 "https://pythonv1.herokuapp.com/data" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Hypec: Schau mal in der Template-Dokumentation wie man Variablen im Template einsetzt. Das ist an der Stelle nicht ganz richtig.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten