Seite 1 von 2
Re: Nutzereingabe verarbeiten Flask
Verfasst: Sonntag 26. August 2018, 09:17
von Sirius3
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.
Re: Nutzereingabe verarbeiten Flask
Verfasst: Sonntag 26. August 2018, 10:48
von Hypec
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.
Re: Nutzereingabe verarbeiten Flask
Verfasst: Montag 27. August 2018, 07:00
von Sirius3
Wichtiger für Dein aktuelles Problem ist eigentlich der zweite Teil meiner Antwort.
Re: Nutzereingabe verarbeiten Flask
Verfasst: Montag 27. August 2018, 09:38
von Hypec
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.
Re: Nutzereingabe verarbeiten Flask
Verfasst: Montag 27. August 2018, 09:59
von Sirius3
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 %}
Re: Nutzereingabe verarbeiten Flask
Verfasst: Freitag 31. August 2018, 21:42
von Hypec
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"
Re: Nutzereingabe verarbeiten Flask
Verfasst: Samstag 1. September 2018, 12:27
von __blackjack__
@Hypec: Schau mal in der Template-Dokumentation wie man Variablen im Template einsetzt. Das ist an der Stelle nicht ganz richtig.