我和一个朋友一直在阅读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
我们想要做的是在validation_processor中为我们自己的值使用**kw。
从读取文档开始,您不会将数据传递给预处理程序,您是预处理程序并且数据传递给您。
数据的确切格式取决于具体的方法:
https://flask-restless.readthedocs.org/en/latest/customizing.html#request-预处理器和后处理器
每种类型请求的预处理器和后处理器接受不同的参数。它们中的大多数应该没有返回值(更具体地说,任何返回值都被忽略)。。。。那些接受字典作为参数的预处理器和后处理器可以(也应该)就地修改它们的参数。
你不直接使用*kw,它只是为了让你的代码转发与Flask-RESTLess兼容,所以如果他们决定更新API并向你的函数发送一组不同的参数,它就不会崩溃。
在您的特定示例中,您只需编辑data
字典,由于Python变量是通过赋值传递的,因此一旦您编辑了它,它就会为链的其余部分进行编辑。
def validation_preprocessor(data=None, **kw):
if data:
data["foobar"] = "rarr I'm a dinosaur"
我个人认为这很令人困惑,也不是我期望的工作方式,但我认为他们有原因。