Geschachtelte Validierung mit der Kolben-restful RequestParser
Mithilfe der Kolben-restful micro-framework, ich habe Probleme bei der Konstruktion einer RequestParser
dass überprüft verschachtelte Ressourcen. Unter der Annahme einer erwarteten JSON-Ressource format der form:
{
'a_list': [
{
'obj1': 1,
'obj2': 2,
'obj3': 3
},
{
'obj1': 1,
'obj2': 2,
'obj3': 3
}
]
}
Jedes Element in a_list
entspricht ein Objekt:
class MyObject(object):
def __init__(self, obj1, obj2, obj3)
self.obj1 = obj1
self.obj2 = obj2
self.obj3 = obj3
... und man würde dann erstellen Sie eine RequestParser mit einer form so etwas wie:
from flask.ext.restful import reqparse
parser = reqparse.RequestParser()
parser.add_argument('a_list', type=MyObject, action='append')
... aber wie überprüfen Sie die verschachtelte MyObject
s dictionary innerhalb a_list
? Oder, alternativ, ist das der falsche Ansatz?
Die API dies entspricht behandelt jeden MyObject
als, im wesentlichen, ein Objekt-literal, und es kann eine oder mehr von Ihnen an die Dienstleistung; daher die Abflachung der Ressource-format wird nicht funktionieren, für diesen Umstand.
- Hat man diese Arbeit aus? Wenn ja, bitte können Sie selbst beantworten, ich bin mit dem gleichen problem hier... vielen Dank im Voraus.
- Nein, tut mir Leid. Nach der Forschung alle Optionen, ließ ich mich auf Django REST Framework.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe Erfolg durch die Schaffung
RequestParser
Instanzen für die verschachtelten Objekte. Analysieren Sie die root-Objekt zunächst wie gewohnt, dann nutzen Sie die Ergebnisse fließen in die Parser für die verschachtelten Objekte.Der trick ist, die
location
argument deradd_argument
- Methode und diereq
argument derparse_args
Methode. Lassen Sie Sie manipulieren, was derRequestParser
sieht.Hier ein Beispiel:
Ich würde vorschlagen, mit einer Daten-Validierung-tool wie cerberus. Beginnen Sie mit der Definition einer schema-Validierung für Ihr Objekt (Geschachtelte Objekt-schema abgedeckt ist diese Absatz), dann verwenden Sie einen validator zur Validierung der Ressource gegen das schema. Sie erhalten auch detaillierte Fehlermeldungen, wenn die Validierung fehlschlägt.
Im folgenden Beispiel möchte ich zum überprüfen eine Liste der Standorte:
Das argument ist wie folgt definiert:
Da die
type
argument hier ist nichts aber ein callable, dass entweder gibt einen geparsten Wert oder raise ValueError auf Ungültiger Typ, ich würde empfehlen die Erstellung Ihrer eigenen Art validator für diese. Der validator könnte ungefähr so Aussehen:Fand ich die bbenne10s Antwort wirklich nützlich, aber es funktionierte nicht für mich da ist.
Wie ich es Tat, das ist wahrscheinlich falsch, aber es funktioniert. Mein problem ist, dass ich nicht verstehe, was
action='append'
tut, als das, was es zu tun scheint, ist wrap den empfangenen Wert in einer Liste, aber es macht keinen Sinn für mich. Kann mir bitte jemand erklären, was der Punkt von diesem in die Kommentare?So, was ich am Ende tun, ist die Schaffung meiner eigenen
listtype
haben, erhalten die Liste innerhalb desvalue
param und dann Durchlaufen Sie die Liste so:Nicht eine wirklich elegante Lösung, aber zumindest es funktioniert. Ich hoffe jemand kann weisen uns in die richtige Richtung...
Update
Als bbenne10 hat gesagt in den Kommentaren, was
action='append'
tut, ist fügen Sie die Argumente den gleichen Namen in eine Liste, also im Fall des OP, es scheint nicht sehr nützlich zu sein.Ich habe iteriert über meine Lösung, weil ich nicht wie die Tatsache, dass
reqparse
war nicht analysieren/überprüfen der verschachtelten Objekten, so dass ich das, was ich gemacht habe, ist die Verwendungreqparse
in der benutzerdefinierten Objekt-Typmyobjlist
.Zuerst habe ich erklärt, eine neue Unterklasse von
Request
, um es zu übergeben, sobald der Antrag beim Parsen von verschachtelten Objekten:Diese Klasse überschreibt die
request.json
so dass es verwendet eine neue json mit dem Objekt analysiert wird.Dann habe ich noch eine
reqparse
parsermyobjlist
zu analysieren, alle Argumente und fügte hinzu, eine Ausnahme zu fangen, den parsing-Fehler und übergeben Sie diereqparse
Nachricht.Diese Weise auch verschachtelte Objekte bekommen wird analysiert durch reqparse und seine Fehler
action="append"
Konten für die Tatsache, dass es absolut gültig bis geben Sie eine HTTP-Anforderung mit einem Schlüssel mehrfach angegeben (d.h. eine GET-Anforderung anhttp://example.com/api?x=1&x=2
ist erlaubt). Kolben wird mit einem MultiDict für jeden Schlüssel undaction="append"
nur stellt dieses Verhalten an den web-Entwickler. Ich denke, was Sie wollte, war zu akzeptieren, eine Liste der Dinge, die aussahen wieMyObj
. Wenn das der Fall ist, ich denke, deine Lösung ist die einzige wirkliche Möglichkeit, um das problem zu lösen sauber.action="append"
in meinem code oben, weil es war in der Beispiel-code, dass Daniel zur Verfügung gestellt :P)Höchsten bewertet-Lösung unterstützt die "strict= "True", Um ein lösen der "strict=" True " nicht-support-Problem, Sie können erstellen eine FakeRequest Objekt zu betrügen RequestParser
BTW: Fläschchen erholsamen rippen, RequestParser heraus, und ersetzen Sie es mit Marshmallow
Gestänge