Как использовать ключевые аргументы в Flask-RESTless

Я и друг читали документы для Flask-RESTless и там написано:

Аргументы функций препроцессора и постпроцессора будут предоставлены в качестве аргументов ключевых слов, поэтому вы всегда должны добавлять **kw в качестве последнего аргумента при определении функции препроцессора или постпроцессора.

но в нем не указано, как мы можем использовать эти ключевые аргументы для передачи информации пре- или постпроцессору. Может кто-нибудь сказать нам, как это сделать?

Наш create_api выглядит следующим образом:

create_api(Foo,
           methods=['GET', 'POST', 'PUT', 'DELETE'],
           collection_name='p',
           url_prefix='/api/v1',
           primary_key='uid',
           exclude_columns=['id'],
           preprocessors={
              'POST': [authenticate, validation_preprocessor],
              'GET_SINGLE': [authenticate],
              'GET_MANY': [authenticate],
              'PUT_SINGLE': [authenticate, validation_preprocessor],
              'PUT_MANY': [authenticate, validation_preprocessor],
              'DELETE': [authenticate]
           })

def validation_preprocessor(data=None, **kw):
    # Do stuff
    pass

Мы хотим использовать **kw в validation_preprocessor для наших собственных значений.

1 ответ

Решение

Читая документы, вы не передаете данные препроцессору, вы препроцессор, и данные передаются вам.

Точный формат данных зависит от конкретного метода:

https://flask-restless.readthedocs.org/en/latest/customizing.html

Препроцессоры и постпроцессоры для каждого типа запроса принимают разные аргументы. У большинства из них не должно быть возвращаемого значения (точнее, любое возвращаемое значение игнорируется).... Те препроцессоры и постпроцессоры, которые принимают словари в качестве параметров, могут (и должны) изменять свои аргументы на месте.

Вы не используете *kw напрямую, это просто для того, чтобы сделать ваш код совместимым с Flask-RESTLess, так что если они решат обновить API и отправить другой набор параметров вашей функции, он не сломается.

В вашем конкретном примере вы бы просто отредактировали data словарь и поскольку переменные Python передаются по присваиванию, после того как вы отредактируете его, он будет отредактирован для остальной части цепочки.

def validation_preprocessor(data=None, **kw):
    if data:
        data["foobar"] = "rarr I'm a dinosaur"

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

Другие вопросы по тегам