Python App-won';t显示由api插入的结果,对于由站点插入的结果将显示

Python App-won';t显示由api插入的结果,对于由站点插入的结果将显示,python,google-app-engine,Python,Google App Engine,我有一个简单的应用程序,可以让你在网页上提交名字。名称和时间戳插入到我的GAE数据存储中。在提交框下方,将显示以前提交的所有名称和时间戳。我还创建了一个api,它还将在数据存储中插入名称和时间戳。由于某些原因,网页上仅显示webapp提交的名称 def person_timestamp_key(person_timestamp): return ndb.Key('Person Timesteamp', person_timestamp) class Person(EndpointsMode

我有一个简单的应用程序,可以让你在网页上提交名字。名称和时间戳插入到我的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的实体上的writeop为5,来自站点的实体上的writeop为6。我认为这不会影响查询结果,但我仍在学习。有什么想法吗?

我通过@Dan Cornilescu的建议解决了这个问题。我认为根本的问题是我没有为API插入设置祖先键。为了解决这个问题,我编写了一个插入DB的方法,然后站点和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

我通过@Dan Cornilescu的建议解决了这个问题。我认为根本的问题是我没有为API插入设置祖先键。为了解决这个问题,我编写了一个插入DB的方法,然后站点和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

您的API插入实体如何获得其祖先和时间戳(在查询中使用)?@DanCornilescu我在上面添加了一些额外的代码。时间戳将自动添加。我在应用程序查询中只有祖先。我从以前的项目中提取了这个。如果有必要,我应该将其添加到API查询中吗?如果没有必要,我可以从应用程序端删除它吗?在数据存储查看器中检查API创建的实体是否确实已创建,是否有父项,以及父项是否与查询中的祖先键匹配。旁注:我在
Person Timesteamp
Key kind中看到一个输入错误,请检查它是否导致post和API方法之间不匹配。@DanCornilescu API创建的实体肯定是根据数据存储查看器创建的。我修正了打字错误,谢谢你的关注。然而,该页面仍然没有显示通过API提交的名称。我不知道如何为API方法设置父级。我尝试过:@Person.method(path='healthsecure',http\u method='POST',name='Person.insert')def PersonInsert(self,Person):Person=Person(parent=Person\u timestamp\u key(Person\u timestamp))Person.put()返回Person,但这只是添加了一个带有“none”的实体我强烈建议将API和标准接口引入到一种通用的DB写入方法中,以确保一致性。但我实际上根本没有看API方面,所以我不知道这是否可能。您的API插入实体如何获得其祖先和时间戳(您在查询中使用)?@DanCornilescu我在上面添加了一些额外的代码。时间戳将自动添加。我在应用程序查询中只有祖先。我从以前的项目中提取了这个。如果有必要,我应该将其添加到API查询中吗?如果没有必要,我可以从应用程序端删除它吗?在数据存储查看器中检查API创建的实体是否确实已创建,是否有父项,以及父项是否与查询中的祖先键匹配。旁注:我在
Person Timesteamp
Key kind中看到一个输入错误,请检查它是否导致post和API方法之间不匹配。@DanCornilescu API创建的实体肯定是根据数据存储查看器创建的。我修正了打字错误,谢谢你的关注。然而,该页面仍然没有显示通过API提交的名称。我不知道如何为API方法设置父级。我尝试过:@Person.method(path='healthsecure',http\u method='POST',name='Person.insert')def PersonInsert(self,Person):Person=Person(parent=Person\u timestamp\u key(Person\u timestamp))Person.put()返回Person,但这只是添加了一个带有“none”的实体我强烈建议将API和标准接口引入到一种通用的DB写入方法中,以确保一致性。但我实际上根本没有看API方面,所以我不知道这是否可能。