我有一个简单的应用程序,允许您在网页上提交名称。名称和时间戳将插入我的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.我不认为这会影响查询的结果,但我还在学习。有什么想法吗?
答案 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