blob: 6700711aaeb96da2bb5c4c741ffc66ea9b1b3e54 [file] [log] [blame]
# If you have not yet seen the source in basic/main.py, please take a look.
# In this sample we add an additional method MyModelGet which allows a specific
# entity to be retrieved.
import endpoints
from google.appengine.ext import ndb
from protorpc import remote
from endpoints_proto_datastore.ndb import EndpointsModel
# In this model definition, we have included _message_fields_schema to define
# a custom ProtoRPC message schema for this model. To see a similar but
# different way to use custom fields, check out the samples in
# custom_api_response_messages/main.py and paging/main.py.
class MyModel(EndpointsModel):
# This results in a ProtoRPC message definition with four fields, in the exact
# order specified here: id, attr1, attr2, and created.
# The fields corresponding to properties (attr1, attr2 and created) are string
# fields as in basic/main.py. The field "id" will be an integer field
# representing the ID of the entity in the datastore. For example if
# my_entity.key is equal to ndb.Key(MyModel, 1), the id is the integer 1.
# The property "id" is one of five helper properties provided by default to
# help you perform common operations like this (retrieving by ID). In addition
# there is an "entityKey" property which provides a base64 encoded version of
# a datastore key and can be used in a similar fashion as "id", and three
# properties used for queries -- limit, order, pageToken -- which are
# described in more detail in paging/main.py.
_message_fields_schema = ('id', 'attr1', 'attr2', 'created')
attr1 = ndb.StringProperty()
attr2 = ndb.StringProperty()
created = ndb.DateTimeProperty(auto_now_add=True)
@endpoints.api(name='myapi', version='v1', description='My Little API')
class MyApi(remote.Service):
@MyModel.method(path='mymodel', http_method='POST', name='mymodel.insert')
def MyModelInsert(self, my_model):
# Here, since the schema includes an ID, it is possible that the entity
# my_model has an ID, hence we could be specifying a new ID in the datastore
# or overwriting an existing entity. If no ID is included in the ProtoRPC
# request, then no key will be set in the model and the ID will be set after
# the put completes, as in basic/main.py.
# In either case, the datastore ID from the entity will be returned in the
# ProtoRPC response message.
my_model.put()
return my_model
# This method is not defined in any of the previous examples: it allows an
# entity to be retrieved from it's ID. As in
# custom_api_response_messages/main.py, we override the schema of the ProtoRPC
# request message to limit to a single field: "id". Since "id" is one of
# the helper methods provided by EndpointsModel, we may use it as one of our
# request_fields. In general, other than these five, only properties you
# define are allowed.
@MyModel.method(request_fields=('id',),
path='mymodel/{id}', http_method='GET', name='mymodel.get')
def MyModelGet(self, my_model):
# Since the field "id" is included, when it is set from the ProtoRPC
# message, the decorator attempts to retrieve the entity by its ID. If the
# entity was retrieved, the boolean from_datastore on the entity will be
# True, otherwise it will be False. In this case, if the entity we attempted
# to retrieve was not found, we return an HTTP 404 Not Found.
# For more details on the behavior of setting "id", see the sample
# custom_alias_properties/main.py.
if not my_model.from_datastore:
raise endpoints.NotFoundException('MyModel not found.')
return my_model
# This is identical to the example in basic/main.py, however since the
# ProtoRPC schema for the model now includes "id", all the values in "items"
# will also contain an "id".
@MyModel.query_method(path='mymodels', name='mymodel.list')
def MyModelList(self, query):
return query
application = endpoints.api_server([MyApi], restricted=False)