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