3

(这是在github上发布的关于令人敬畏的endpoints-proto-datastore库的相同问题的副本)

我正在尝试实现我的 API,以便客户端可以在 api 请求中传递 '?fields=' url 参数,然后我可以指示查询构建响应并仅返回请求的 collection_fileds。

但是,我不知道如何将 url 参数传递给 @query_method 装饰器;这是我的代码:

@Contact.query_method(query_fields=('limit', 'order', 'pageToken'),
                      collection_fields=('name', 'birthday'),
                      path='contacts',
                      name='contacts.list')
def contacts_list(self, query):
    return query

如何fields将请求中的参数传递给装饰器中的 collection_fields= 命名参数?

4

1 回答 1

6

这个问题的答案有点类似于Simple Access API (Developer Key) with Google Cloud Endpoint (Python)

users_id_token.py中,request对象是解析传入请求的 ProtoRPC 对象。但是,即使实际用户没有指定键'bearer_token''access_token'作为 ProtoRPC 消息定义的一部分,如果它们作为查询参数在请求中传递,它们将存储在创建的 ProtoRPC 对象中。

要访问它们,使用了不太知名的方法:

request.get_unrecognized_field_info(key)

为什么这很重要?要访问fields一个对象,我们假设属性fields是通过请求传入的。然后,如果您将请求解析为my_message,则可以访问fieldsvia

my_message.get_unrecognized_field_info('fields')

ndb/model.py中,该query_method方法定义了一个局部范围的函数,该函数被调用QueryFromRequestMethod。在其中,直接创建了一个 ProtoRPC 对象:

request_entity = cls.FromMessage(request)

它在你想使用的地方

request_entity.get_unrecognized_field_info('fields')

我建议要么

  1. 使用仅适用于您的用例的库的修补版本
  2. 向库提交修复,允许以轻量级方式在方法中进行此自定义
  3. 子类endpoints_proto_datastore.ndb.EndpointsModel化和覆盖query_method方法来做你的特别出价。
于 2014-01-27T16:52:42.623 回答