Bottle einlesen aus Formular und float ...

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

Einen schönen guten Abend :D

Ich habe folgendes Problem.
Aus einem Formular bekomme ich Daten.
Diese möchte ich dann in den richtigen Datentyp bringen
um diese dann ordnungsgemäß zu verarbeiten.
Jetzt müssen nicht alle Felder ausgefüllt werden, da es auf die Konfiguration ankommt.

Code: Alles auswählen

wp1 = float(request.forms.get('wp1'))
wp2 = float(request.forms.get('wp2'))
Wenn nun in dem oben angegebden Beispiel wie z.B. wp2 nicht angegeben ist,
dann kommt es zu dem Fehler

ValueError: empty string for float()

Gibt es eine Möglichkeit das es nicht zu diesem Fehler kommt?
Eine andere Möglichkeit wäre abzufragen welche Konfiguration gesetzt wurde
und dann nur die in den Dateiformat bringen, was aber umständlicher wäre :)

lg
mathman
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

``get`` hat vermutlich nen zweiten Parameter, den Standardwert falls der Wert nicht gesetzt ist. Dann gibst du dort ``0`` an (oder was du halt dann haben willst).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

Habe in der Doku leider nichts dazu gefunden
wie man einen Wert setzen kann der automatisch kommt
wenn kein Wert vorhanden ist :K
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Was hindert dich,

Code: Alles auswählen

wp1 = float(request.forms.get('wp1', 0))
auszuprobieren, wie ich geschrieben habe?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

In der doku wird beschreiben, das request.forms/files/POST/GET u.s.w. im Grunde dictionaries sind. Sie können also alles, was normale dictionaries auch können.
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@mathman: Unabhängig davon solltest du so wie so mindestens noch ein "try... except" drum setzen, weil du auch eine Exception bekommst, wenn der Nutzer Buchstaben eingibt. Oder, eleganter, nimm' ein Framework wie WTForms, was die Eingaben direkt valdieren kann.

Gruß, noisefloor
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

Leonidas hat geschrieben:Was hindert dich,

Code: Alles auswählen

wp1 = float(request.forms.get('wp1', 0))
auszuprobieren, wie ich geschrieben habe?

Hatte deine Antwort leider nicht verstanden :oops:

Ich habe es nun ausprobiert, leider kommt es immer noch zu dem Fehler :K
l1 = float(request.forms.get('l1', 0))
ValueError: empty string for float()
noisefloor hat geschrieben:Hallo,

@mathman: Unabhängig davon solltest du so wie so mindestens noch ein "try... except" drum setzen, weil du auch eine Exception bekommst, wenn der Nutzer Buchstaben eingibt. Oder, eleganter, nimm' ein Framework wie WTForms, was die Eingaben direkt valdieren kann.

Gruß, noisefloor
Das wollte ich eigentlich mit JavaScript im Vorfeld abfangen. Man könnte zwar JavaScript ausschalten, dann würde aber die gesamte Eingabemaske nicht funktionieren, von daher muss es ja eh an sein :wink:
BlackJack

@mathman: So etwas sollte man immer auf dem Server machen. Das JavaScript kann ja auch aus ganz anderen Gründen nicht laufen. Zum Beispiel wenn jemand die Weboberfläche doof findet und sich ein Skript schreibt, welches deine Webanwendung per HTTP benutzt. Der kann dann aus versehen oder absichtlich falsche Daten schicken. Der Überprüfung von Daten beim Client darf man nicht vertrauen.
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

BlackJack hat geschrieben:@mathman: So etwas sollte man immer auf dem Server machen. Das JavaScript kann ja auch aus ganz anderen Gründen nicht laufen. Zum Beispiel wenn jemand die Weboberfläche doof findet und sich ein Skript schreibt, welches deine Webanwendung per HTTP benutzt. Der kann dann aus versehen oder absichtlich falsche Daten schicken. Der Überprüfung von Daten beim Client darf man nicht vertrauen.
das programm läuft lokal :)
Also wenn da einer Schabernack treibt dann ist er selbst schuld. Aber du hast recht.

Das Problem lässt sich leider auch nicht mit folgendem umgehen

Code: Alles auswählen

    l1 = request.forms.get('l1')
    if l1 != None: float(l1)
Da es irgendwie auch nicht Nichts ist :K
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Es wurde doch schon gesagt, dass du Exceptions nutzen sollst…
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Wenn der Benutzer nichts in das Formular-Feld ein tippt, liefert "request.forms.get('l1')" korrekterweise einen leeren String zurück. Schließlich war das Formular-Feld ja da, es war nur leer. Nur wenn gar kein Formular-Feld mit diesem Namen übertragen wurde, liefert get() "None" bzw. der optionale Default-Wert zurück.

Unabhängig davon solltest du dir gleich zu Beginn angewöhnen, Benutzereingaben genauestens zu prüfen und für jede Eventualität bereit zu sein. "Wird ja nur im Intranet benutzt" ist eine beliebte Ausrede, aber sowas sollte man sich gar nicht erst angewöhnen :)

Code: Alles auswählen

try:
    value = float(request.forms.get('l1'))
except (ValueError, TypeError):
    value = None
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
mathman
User
Beiträge: 92
Registriert: Mittwoch 19. November 2008, 08:27
Wohnort: Magdeburg
Kontaktdaten:

Vielen Dank für die Antworten,
ja ihr habt Recht, ich werde die Funktion jetzt umschreiben.

Gruß
Antworten