Flask Python Modellvalidierung

8

Ausgehend von einem PHP-Hintergrund lerne ich Python durch Flask. Ich habe WTForms für den Client verwendet, und dies behandelt Validierung gut.

Eines der Dinge, für die ich flash verwenden möchte, ist jedoch eine öffentliche API. In diesem Fall möchte ich, dass alle Validierungen auf meinen Modellen ausgeführt werden. Ich dachte, dass SQLAlchemy Validierungsfunktionalität enthalten würde, aber das scheint nicht der Fall zu sein.

Ich bin auf Colander gestoßen, was nett aussieht, aber ich bin etwas überrascht dass es nicht mehr allgegenwärtige Validierungsbibliotheken gibt. Und noch mehr überrascht, dass SQLAlchemy dies nicht nativ tut.

Was sind die Optionen hier? Vielleicht fehlt mir etwas, aber wie kann ich einfach Modelldaten validieren?

    
JonoB 20.07.2012, 15:20
quelle

3 Antworten

16

Haben Sie in Betracht gezogen, die Validierung in der Model-Schicht ...

durchzuführen?

Dies würde Ihnen eine vollkommen trockene Lösung ermöglichen, da die Validierung automatisch ausgelöst würde, unabhängig davon, ob die Updatequelle vom Benutzer gesendete Daten ist oder ob es eine Komponente Ihrer Anwendung ist, die das Modell als Teil einer indirekten Aktualisierung aktualisiert . Kurz gesagt, Sie können diese Lösung auch in Ihrem Front-End mit WTForms wiederverwenden und haben nur eine Stelle, an der Sie Ihre Validierung für Ihre API und Ihr Front-End durchführen.

Siehe diese Antwort , um mehr Vorteile für die Validierung im Modell zu erhalten.

... mit den von SQLAlchemy bereitgestellten Tools?

1. Der validates() Decorator zur einfachen Validierung:

Die Verwendung dieses Dekorators ist ziemlich einfach: Wenden Sie sie einfach auf die Felder an, die Sie validieren möchten:

%Vor%

2. ORM-Ereignisse für komplexe Geschäftsregeln:

Sie können mit Attributereignissen eine komplexe Validierung direkt durchführen, wenn eines der Attribute einer Instanz eines Modells geändert wird. Der Vorteil der Verwendung von Attributereignissen besteht darin, dass garantiert ist, dass die Daten in der Sitzung (die im Speicher befindlichen Objekte) in einem validierten Zustand sind.

Hier ist ein Beispiel ( ein einfaches , aber Sie sollten hier komplexe Regeln denken) aus dokumente :

%Vor%

Sie können auch Mapper-Ereignisse wie before_insert , um die Validierung auf den Aufruf session.add() zu verschieben, oder verwenden Sie sogar Sitzungsereignisse , um Commits abzufangen ... Aber Sie verlieren die Integritätsgarantie der Daten in der Sitzung ...

    
edsioufi 02.09.2013 19:45
quelle
2

Solange die eintreffenden Daten in einem Multi-Dict-ähnlichen Format gelesen werden können, gibt es keinen Grund, warum Sie WTForms nicht für die Validierung verwenden können (obwohl es ein wenig peinlicher ist als die Verwendung von Colander) / p>

Für eine hypothetische API, die JSON erzeugt und konsumiert, können Sie beispielsweise Folgendes tun:

%Vor%     
Sean Vieira 21.07.2012 03:44
quelle
1

Ich schreibe dafür eine Bibliothek namens Flask-Inputs .

Ähnlich wie bei Colander definieren Sie Schemas und validieren Ihre Eingaben für sie. Wie der Vorschlag von @Sean Vieira beruht er auf WTForms zur Validierung.

Intern werden alle request -Eingabedaten in MultiDicts konvertiert. Genau wie WTForms können Sie benutzerdefinierte Validatoren definieren (ein eingebauter benutzerdefinierter Validator ist für request.json data, verwendet jsonschema für die Validierung).

Da es sich anhört, als würden Sie eine Validierung für Daten durchführen, die an eine öffentliche API gesendet werden, finden Sie hier ein Beispiel für einen API-Schlüssel und eine veröffentlichte JSON-Validierung.

%Vor%

Dann auf Ihrer Route:

%Vor%

Die größten Vorteile, die ich gefunden habe (in der Produktion), sind alle Fehler an einem Ort. Gute Validatoren, die alle eingehenden Daten abdecken, verhindern ein unerwartetes / undefiniertes Verhalten in der Produktion.

    
nathancahill 08.10.2015 20:53
quelle

Tags und Links