Как использовать аргументы ключевого слова в 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 для наших собственных значений.


person jwanglof    schedule 04.02.2015    source источник


Ответы (1)


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

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

https://flask-restless.readthedocs.org/en/latest/customizing.html#request-preprocessors-and-postprocessors

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

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

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

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

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

person Rachel Sanders    schedule 04.02.2015
comment
Спасибо за объяснение! Очень помогло =) - person jwanglof; 05.02.2015
comment
Потрясающие! Я так рад. :) - person Rachel Sanders; 05.02.2015