2017-03-09 7 views
1

J'ai méthode Flask que workd parfaitement via HTTP:Comment passer des arguments à la méthode webargs directement à partir du code sans appel http?

class PricePerPeriod(Resource): 

    args = {'period': fields.Int(required=True, validate=lambda val: val > 0), 
      'duration': fields.Int(required=True, validate=lambda val: val > 0)} 

    @use_kwargs(args) 
    def get(self, identifier_id, period, duration): 

api.add_resource(PricePerPeriod, '/price/<int:identifier_id>/')

avec des appels comme celui-ci http://localhost:8080/price/21/?period=1&duration=60

Toutefois, si je tente d'appeler cette méthode à partir du code:

price_per_period = PricePerPeriod() 
result = price_per_period.get(identifier_id, period, duration) 

Echec de la vérification des arguments par webargs.

{"errors": { 
    "period": [ 
     "Missing data for required field." 
    ] 
}} 

Je peux seulement supposer que @use_kwargs (args) attend args à remplir, ce qui, dans le cas d'un appel direct est vide que les paramètres sont transmis directement à fonctionner.

Comment puis-je invoquer la méthode décorée avec @use_kwargs(args) à partir du code et lui transmettre les arguments correctement?

Répondre

1

Il est judicieux de garder votre liaison flacon séparée de votre logique métier. C'est le cas pour toute liaison à un framework ou une bibliothèque tiers. De vous ne le faites pas, vous finirez toujours avec un certain nombre de méthodes qui sont «polluées» avec des trucs de tiers.

Donc je vous suggère d'implémenter votre méthode get sans utiliser le décorateur @use_kwargs, et de créer une classe indépendante de flask.

Un objet de cette classe peut ensuite être enveloppé dans un objet de liaison de flasque, qui a les mêmes méthodes, mais décorées. De cette façon, vous avez la possibilité d'utiliser votre propre logique de la façon dont vous l'avez conçu, et une séparation claire des préoccupations.

class FlaskBinding: 
    def _init_(self): 
    self.obj = PricePerPeriod() 

    @use_kwargs 
    def get(self,...): 
    return self.obj.get() 
+0

Soudns raisonnable et propre. Merci! – uzla