Как передать аргументы методу webargs напрямую из кода без http-вызова?

У меня есть метод Flask, который отлично работает через 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>/')

с такими звонками 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) ожидает заполнения аргументов, которые в случае прямого вызова являются пустыми, поскольку параметры передаются в функцию напрямую.

Как я могу вызвать метод, украшенный @use_kwargs(args) из кода и передать ему аргументы правильно?

1 ответ

Решение

Целесообразно хранить привязку колбы отдельно от бизнес-логики. Это касается любой привязки к любой сторонней платформе или библиотеке. Из вас нет, вы всегда будете в конечном итоге с помощью ряда методов, которые "загрязнены" материалами третьих сторон.

Поэтому я предлагаю вам реализовать свой метод get без использования декоратора @use_kwargs и создать класс, независимый от flask.

Затем объект этого класса van будет помещен в объект привязки фляги, имеющий методы Same, но оформленные.

Таким образом, вы можете гибко использовать собственную логику так, как вы ее разработали, и четкое разделение проблем.

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

  @use_kwargs
  def get(self,...):
    return self.obj.get()
Другие вопросы по тегам