Search code examples
pythongoogle-app-enginegoogle-cloud-datastorewebapp2

App Engine NDB Simple Create Read Update


What is the best way to store one editable string in Python Google App Engine? I tried to use NDB, with a single route to create, read, and update the string. But this does not seem to work:

class Storage(ndb.Model):
    content  = ndb.StringProperty()

class CreateReadUpdate(webapp2.RequestHandler):
    def get(self):
        entity = ndb.Key(Storage, 'name').get()
        self.response.out.write(entity.content)
    def post(self):
        content = json.loads(self.request.body).get('content')
        entity = ndb.Key(Storage, 'name').get()
        if not entity:
            entity = Storage(content='')
        entity.content = content
        entity.put()

Not sure how to debug in this environment. So I have to ask, what is wrong here? I just want the simplest App Engine CRUD possible.


Solution

  • Start debugging with logging on dev and on production.

    Simple example:

    import logging
    
    ...
    
    logging.info(entity.property)
    

    Your problem is that you are not providing a key_name/id for the entity you are saving (if everything else is fine), thus when you try to display it you get nothing.

    Change you save logic to this:

    def post(self):
        content = json.loads(self.request.body).get('content')
        entity = ndb.Key(Storage, 'name').get()
        if not entity:
            entity = Storage(id='name', content='') # see here
        entity.content = content
        entity.put()
    

    or as an alternative:

    def post(self):
        content = json.loads(self.request.body).get('content')
        entity = Storage.get_or_insert('name')
        entity.content = content
        entity.put()
    

    If you need an example check "How to use GAE with AJAX" from a previous answer and this is the repo