如何直接从没有http调用的代码传递参数到webargs方法?

时间:2017-03-09 16:46:20

标签: python flask webargs

我有通过HTTP完美工作的Flask方法:

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>/')

通过这样的调用http://localhost:8080/price/21/?period=1&duration=60

但是如果我尝试从代码中调用这样的方法:

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

它依赖于webargs检查参数。

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

我只能假设@use_kwargs(args)期望填充args,在直接调用的情况下为空,因为参数直接传递给函数。

如何从代码中调用用@use_kwargs(args)修饰的方法并正确传递给它?

1 个答案:

答案 0 :(得分:1)

明智的做法是将烧瓶绑定与业务逻辑分开。每个绑定到任何第三方框架或库的情况都是如此。在你们中间,你们总会得到许多被污染的方法。与第三方的东西。

所以我建议你在不使用@use_kwargs装饰器的情况下实现你的get方法,并创建一个独立于flask的类。

然后将该类货车的一个对象包装到一个烧瓶装订对象中,该对象具有相同但装饰的方法。

通过这种方式,您可以灵活地按照自己设计的方式使用自己的逻辑,并明确区分关注点。

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

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