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

相關問題