Python App-won';t显示由api插入的结果,对于由站点插入的结果将显示
我有一个简单的应用程序,可以让你在网页上提交名字。名称和时间戳插入到我的GAE数据存储中。在提交框下方,将显示以前提交的所有名称和时间戳。我还创建了一个api,它还将在数据存储中插入名称和时间戳。由于某些原因,网页上仅显示webapp提交的名称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
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方面,所以我不知道这是否可能。