2

我有通过 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)代码装饰的方法并将参数正确传递给它?

4

1 回答 1

1

将烧瓶绑定与业务逻辑分开是明智的。对任何第三方框架或库的每次绑定都是这种情况。如果你不这样做,你最终会得到许多被第三方东西“污染”的方法。

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

然后将该类 van 的一个对象包装到一个烧瓶绑定对象中,该对象具有相同但经过修饰的方法。

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

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

  @use_kwargs
  def get(self,...):
    return self.obj.get()
于 2017-03-09T16:55:47.423 回答