1

我和一个伙伴一直在阅读 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_preprocessor 中使用**kw 作为我们自己的值。

4

1 回答 1

2

从阅读文档开始,您不会将数据传递给预处理器,您预处理器,数据会传递给

数据的确切格式取决于具体方法:

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

每种类型的请求的预处理器和后处理器接受不同的参数。它们中的大多数应该没有返回值(更具体地说,任何返回值都被忽略)......那些接受字典作为参数的预处理器和后处理器可以(并且应该)就地修改它们的参数。

您不直接使用 *kw,它只是为了使您的代码与 Flask-RESTLess 兼容,因此如果他们决定更新 API 并向您的函数发送一组不同的参数,它不会中断。

在您的特定示例中,您只需编辑data字典,并且由于 Python 变量是通过 assignment 传递的,因此一旦您对其进行了编辑,它将针对链的其余部分进行编辑。

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

我个人认为这令人困惑,而不是我期望的事情如何运作,但我认为他们有理由这样做。

于 2015-02-04T21:28:24.140 回答