Guten Morgen,
danke für die Anmerkungen.
Das was mir an Fehler eingefallen ist, habe ich jetzt eingebaut. Mein übliches Problem dabei ist wieder, das ich doppelten Code habe. Ich kann allerdings eine Funktion, die Daten prüft nicht mal Daten und mal Wahrheitswerte zurück geben lassen, daher so. Und weil wir schon dabei sind, zeige ich die vollständige `views.py`. `filter_operation_hours` kann ich erst am Mittwoch testen, daher ist mir auch der Fehler mit zwei mal `fetch` nicht aufgefallen.
views.py:
Code: Alles auswählen
from datetime import datetime as dt
from json import loads
import influxalchemy
import influxdb
import pandas as pd
from django.http import JsonResponse, HttpResponse
class SPS(influxalchemy.Measurement):
__measurement__ = "Sensors"
def filter_operation_hours(date_range, pressure_range):
with influxdb.DataFrameClient(database="Maschine") as client:
influx = influxalchemy.InfluxAlchemy(client)
data = (
influx.query(SPS.BP005)
.filter(SPS.time.between(*date_range))
.execute()["Sensors"]
)
data = data[data.index != "Time"]
data["duration"] = data.index.diff()
data = data.drop(data["BP005"][data["BP005"] < pressure_range["min"]].index)
data = data.drop(data["BP005"][data["BP005"] > pressure_range["max"]].index)
return pd.to_timedelta(data["duration"]).sum() / pd.Timedelta("1 hour")
def get_operation_hours(request):
if request.method == "POST":
user_data = dict(loads(request.body.decode("UTF-8")))
if not _is_incoming_data_valid(user_data):
return HttpResponse(reason="Eingabewerte sind nicht valide", status=400)
date_range = (
dt.fromisoformat(user_data["startDate"]),
dt.fromisoformat(user_data["endDate"]),
)
pressure_range = {
"min": float(user_data["minPressure"]),
"max": float(user_data["maxPressure"]),
}
return JsonResponse(
{"operation_hours": filter_operation_hours(date_range, pressure_range)}
)
return HttpResponse(reason="Anfrage konnte nicht verarbeitet werden", status=405)
def _is_incoming_data_valid(user_data):
try:
date_range = (
dt.fromisoformat(user_data["startDate"]),
dt.fromisoformat(user_data["endDate"]),
)
pressure_range = {
"min": float(user_data["minPressure"]),
"max": float(user_data["maxPressure"]),
}
except (KeyError, ValueError):
return False
if _is_date_valid(date_range) & _is_pressure_valid(pressure_range):
return True
return False
def _is_pressure_valid(pressure_range):
return pressure_range["min"] <= pressure_range["max"]
def _is_date_valid(date_range):
return date_range[0] <= date_range[1]
Edit: Mit dem `float` bin ich mir nicht sicher. Es ist unnötig, weil ich keine Strings schicke. Wenn aber durch ein Fehler andere Daten kommen, zum Beispiel ein String und eine Zahl, dann wird das im Größenvergleich nicht abgefangen. Ich weiß nie wie weit die Überprüfung gehen soll.
Die Änderung an `evaluation.js`:
Code: Alles auswählen
const { createApp, ref, computed } = Vue
createApp({
setup() {
let startDate = ref()
let endDate = ref()
let operationHours = ref( 0 )
async function getOperationHours() {
const response = await fetch( 'http://localhost:8000/evaluation/', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ "startDate": startDate.value, "endDate": endDate.value })
})
if ( response.status === 400 ) {
alert("Eingabewerte entsprechen nicht den Vorgaben!")
} else {
const hours = await response.json();
operationHours.value = hours[ "operation_hours" ];
}
}
const isDaterangeValid = computed(() => {
return Date.parse( endDate.value ) >= Date.parse( startDate.value )
})
return {
startDate, endDate, operationHours,
getOperationHours,
isDaterangeValid
}
}
}).mount('#app')
Bei 405 wird auf der Seite nichts ausgegeben, da das meiner Meinung nach nicht vorkommen kann, wenn man auf den Button klickt, sondern wenn man bewusst unzulässige Anfragen schickt.
Wenn ich eure vorherigen Antworten durch lese, dann gibt es von der Trennung kein wirkliches richtig und falsch. Zum einen was das Thema angeht, was gehört in einen Container und was nicht, wie auch die Trennung von Back- und Frontend. Stand jetzt mag ich den Aufbau von Back- und Frontend so wie ich es habe und würde das beibehalten, es sei den es gibt aus eurer Erfahrung heraus Bedenken.
Was sich für mich sehr gut anhört:
Bei Containern ist es wichtig, dass man schon vorher ein sauberes Deployment hat, dann baut man ein wheel und der ganze Containerbau besteht daraus, ein Python-Basis-Image zu nehmen und pip install aufzurufen.
Dazu würde ich allerdings Hilfe benötigen, mal wieder. Wie ist denn ein "sauberes Deployment" definiert? Ich hole aktuell mit `git` den aktuellen Projektstand und je nach dem was geändert wurde, muss ich eventuell irgendwelche Konfigurationsdateien anpassen. Ich denke nicht, dass das "sauber" ist. Wie läuft das in der Praxis ab?
Danke und Grüße
Dennis