Question

(This is a copy of a the same question posted on github about the awesome endpoints-proto-datastore library)

I am trying to implement my API so that the client can pass a '?fields=' url parameter in the api request and then I can instruct the query to build the response and return only the requested collection_fileds.

However, I don't know how to pass url parameters to the @query_method decorator; here's my code:

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

How can I pass the fields param from the request to the collection_fields= named param in the decorator?

Was it helpful?

Solution

The answer to this is somewhat similar to Simple Access API (Developer Key) with Google Cloud Endpoint (Python)

In users_id_token.py, the request object is a ProtoRPC object that parsed an incoming request. However, even if the actual user did not specify on of the keys 'bearer_token' or 'access_token' as part of the ProtoRPC message definition, if they were passed in the request as query parameters, they will be stored on the ProtoRPC object that is created.

To access them, the not-so-well-known method is used:

request.get_unrecognized_field_info(key)

Why is this important? To access fields on an object, let's assume the attribute fields was passed in through the request. Then if you have a request parsed into my_message, you can access the fields via

my_message.get_unrecognized_field_info('fields')

In ndb/model.py, the query_method method has a locally scoped function defined there which is called QueryFromRequestMethod. In it, a ProtoRPC object is created directly:

request_entity = cls.FromMessage(request)

It is there where you'd want to use

request_entity.get_unrecognized_field_info('fields')

I would suggest either

  1. Using a patched version of the library that only works for your use case
  2. Submitting a fix to the library that allows for this customization in the method in a lightweight way
  3. Subclassing endpoints_proto_datastore.ndb.EndpointsModel and overriding the query_method method to do your special bidding.
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top