Imbriquée de validation avec le flacon reposant RequestParser
À l'aide de la flacon-sommeil micro-framework, j'ai de la difficulté à construire un RequestParser
qui permettra de valider imbriquée ressources. En supposant que prévu JSON format de la ressource, de la forme:
{
'a_list': [
{
'obj1': 1,
'obj2': 2,
'obj3': 3
},
{
'obj1': 1,
'obj2': 2,
'obj3': 3
}
]
}
Chaque élément dans a_list
correspond à un objet:
class MyObject(object):
def __init__(self, obj1, obj2, obj3)
self.obj1 = obj1
self.obj2 = obj2
self.obj3 = obj3
... et il faudrait alors créer un RequestParser à l'aide d'un formulaire quelque chose comme:
from flask.ext.restful import reqparse
parser = reqparse.RequestParser()
parser.add_argument('a_list', type=MyObject, action='append')
... mais comment voulez-vous valider la imbriquée MyObject
s de chaque dictionnaire à l'intérieur de a_list
? Ou, alternativement, est-ce la bonne approche?
L'API, ce qui correspond à la traite chaque MyObject
que, pour l'essentiel, un objet littéral, et il peut y avoir un ou plusieurs d'entre eux sont passés au service; par conséquent, l'aplatissement de la ressource, le format ne fonctionnera pas pour cette circonstance.
- Avez-vous faire ce travail? Si oui, s'il vous plaît pourriez-vous fournir une auto-réponse, je vais avoir le même problème ici... Merci à l'avance.
- Non, désolé. Après des recherches sur toutes les options, j'ai choisi de Django RESTE du Cadre.
Vous devez vous connecter pour publier un commentaire.
J'ai eu du succès en créant
RequestParser
cas pour les objets imbriqués. Analyser l'objet racine d'abord comme vous le feriez normalement, puis utiliser les résultats pour nourrir les analyseurs pour les objets imbriqués.Le truc, c'est le
location
argument de laadd_argument
méthode et lareq
argument de laparse_args
méthode. Ils vous permettent de manipuler ce que leRequestParser
regarde.Voici un exemple:
Je vous suggérons d'utiliser des données de validation de l'outil comme cerberus. Vous commencez par définir une validation de schéma de votre objet (objet Imbriqué schéma est couvert dans cette paragraphe), puis d'utiliser un programme de validation pour valider la ressource par rapport au schéma. Vous aussi vous obtenez des messages d'erreur lors de la validation échoue.
Dans l'exemple suivant, je veux valider une liste des lieux:
L'argument est défini comme suit:
Depuis le
type
argument ici n'est rien, mais un callable qui renvoie une valeur analysée ou raise ValueError sur type non valide, je suggère de créer votre propre type validateur pour cela. Le validateur pourrait ressembler à quelque chose comme:J'ai trouvé le bbenne10s répondre vraiment utile, mais il ne fonctionne pas pour moi comme.
La j'ai fait, c'est probablement faux, mais il fonctionne. Mon problème est que je ne comprends pas ce
action='append'
n'a que ce qu'il semble être à faire est de envelopper la valeur reçue dans une liste, mais il n'a pas de sens pour moi. Quelqu'un peut-il expliquer quel est le point de cela dans les commentaires?Donc ce que j'ai fini par faire, c'est de créer mon propre
listtype
, obtenir la liste à l'intérieur de lavalue
param et puis itérer sur la liste de cette façon:Pas vraiment une solution élégante, mais au moins il fait le travail. J'espère que quelqu'un peut nous indiquer la bonne direction...
Mise à jour
Comme bbenne10 a dit dans les commentaires, ce
action='append'
n'est ajouter tous les arguments portant le même nom dans une liste, de sorte que dans le cas de l'OP, il ne semble pas être très utile.J'ai itéré ma solution parce que je n'aimais pas le fait que
reqparse
n'était pas d'analyse/validation de l'un quelconque des objets imbriqués j'ai donc ce que j'ai fait, est d'utiliser unereqparse
à l'intérieur de l'objet personnalisé typemyobjlist
.D'abord, j'ai déclaré une nouvelle sous-classe de
Request
, pour passer d'en faire la demande lors de l'analyse des objets imbriqués:Cette classe remplace la
request.json
de sorte qu'il utilise une nouvelle json avec l'objet à être analysée.Ensuite, j'ai ajouté un
reqparse
analyseurmyobjlist
pour analyser tous les arguments et a ajouté une exception pour intercepter l'erreur d'analyse et de passer lereqparse
message.De cette façon, même les objets imbriqués obtiendrez analysée à travers reqparse et montrer ses erreurs
action="append"
qui explique le fait qu'il est parfaitement valable pour spécifier une requête HTTP avec une clé spécifiée plusieurs fois (c'est à dire une requête GET àhttp://example.com/api?x=1&x=2
est autorisé). Flacon fait en utilisant un MultiDict pour chaque clé etaction="append"
juste expose ce comportement pour le développeur web. Je pense que ce que tu voulais, c'était d'accepter une liste de choses qui ressemblaient à desMyObj
. Si c'est le cas, je pense que votre solution est la seule vraie manière de résoudre le problème proprement.action="append"
dans mon code ci-dessus, car il était présent dans l'exemple de code que Daniel fournis :P)La cote la plus élevée de la solution ne prennent pas en charge de stricte=True', Pour résoudre la "stricte=True' pas de problème de prise en charge, vous pouvez créer un FakeRequest objet de tricher RequestParser
BTW: flacon reposant rip RequestParser, et de le remplacer avec de la Guimauve
Lien