应用程序不会显示api插入的结果,也不会显示网站插入的结果

时间:2016-02-04 19:09:27

标签: python google-app-engine

我有一个简单的应用程序,允许您在网页上提交名称。名称和时间戳将插入我的GAE数据存储区中。在提交框下方,显示所有先前提交的名称和时间戳。我还创建了一个api,它还会在数据存储区中插入名称和时间戳。出于某种原因,只有webapp提交的名称才会显示在网页上。

def person_timestamp_key(person_timestamp):
  return ndb.Key('Person Timesteamp', person_timestamp)

class Person(EndpointsModel):
  name = ndb.StringProperty(indexed=False)
  timestamp = ndb.DateTimeProperty(auto_now_add=True)

从应用中插入:

def post(self):
    person_timestamp = 'person_timestamp'

    # Sets entity for comments
    person = Person(parent=person_timestamp_key(person_timestamp))

    name = self.request.get('name')

    if name and not name.isspace():
        person.name = name
        person.put()

从API中插入:

  @Person.method(path='healthsecure', http_method='POST', name='person.insert')
  def PersonInsert(self, person):
    person.put()
    return person

查询在网站上显示名称:

names_query = Person.query(
        ancestor=person_timestamp_key(person_timestamp)).order(+Person.timestamp)
names = names_query.fetch()

在数据存储区中,来自站点的实体和来自api的实体之间的唯一区别是来自API的实体的WriteOps是5,而来自站点的是6.我不认为这会影响查询的结果,但我还在学习。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我能够通过@Dan Cornilescu的建议来解决这个问题。我认为潜在的问题是我没有为API插入设置祖先密钥。为了解决这个问题,我写了一个插入数据库的方法,然后网站和API使用该方法。

DataStoreWrite.py:

def person_timestamp_key(person_timestamp):
return ndb.Key('Person Timestamp', person_timestamp)


class Person(EndpointsModel):
    name = ndb.StringProperty(indexed=False)
    timestamp = ndb.DateTimeProperty(auto_now_add=True)

def do_insert(self, name):
    person_timestamp = 'person_timestamp'
    # Sets entity
    person = Person(parent=person_timestamp_key(person_timestamp))

    person.name = name

    person.put()

main.py:

def post(self):

    name = self.request.get('name')

    person = DatastoreWrite.Person()

    if name and not name.isspace():
        person.do_insert(name)

    self.redirect('/')

main_api.py

@endpoints.api(name='healthsecure', version='v1',
           allowed_client_ids=[WEB_CLIENT_ID, ANDROID_CLIENT_ID,
                               IOS_CLIENT_ID, endpoints.API_EXPLORER_CLIENT_ID],
           audiences=[ANDROID_AUDIENCE],
           scopes=[endpoints.EMAIL_SCOPE])
class HealthSecureApi(remote.Service):
      """healthsecure API v1."""
      @Person.method(path='person', http_method='POST', name='person.insert')
      def PersonInsert(self, person):

          person.do_insert(person.name)

          return person