【问题标题】:How to pass arguments to webargs method directly from code without http call?如何在没有http调用的情况下直接从代码将参数传递给webargs方法?
【发布时间】:2017-07-30 18:25:15
【问题描述】:

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

【问题讨论】:

    标签: python flask webargs


    【解决方案1】:

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

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

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

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

    class FlaskBinding:
      def _init_(self):
        self.obj = PricePerPeriod()
    
      @use_kwargs
      def get(self,...):
        return self.obj.get()
    

    【讨论】:

    • 听起来合理而干净。谢谢!
    猜你喜欢
    • 2017-03-08
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    • 2020-12-19
    • 2018-12-06
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多