3

(这是对github发布有关真棒endpoints-proto-datastore库同样的问题复印件)如何将api请求中的collection_fields传递给@query_method装饰器?

我想实现我的API,以便客户端可以在API请求传递一个“?场=” 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 PARAM从请求到collection_fields =名为PARAM的设计师吗?

回答

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,可以通过

my_message.get_unrecognized_field_info('fields') 

访问fieldsndb/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方法来执行您的特殊出价。
+0

感谢@bossylobster的建议。我只注意到只有索引属性可以被预测:(这使得我重新设计我的查询策略,并可能最终做出不同的事情,如果我必须实现一个解决方案,我会用#2去做。 – Cato

+0

太好了!接受答案/ upvote ?我推荐阅读http://bjk5.com/post/54202245691/the-app-engine-way关于如何优化你的应用程序,你可以做一个简单的map-reduce来读取所有实体,正确索引,然后写回相同的实体。 – bossylobster

+1

推荐阅读的好文章!再次感谢。接受你的答案,但由于名誉低而无法赞成;)...我会到达那里! – Cato

相关问题