невозможно обновить хранилище данных в google-apps-engine - PullRequest
0 голосов
/ 03 июня 2018

Я создал объект хранилища данных аналогично учебнику в гостевой книге:

class myDS(ndb.Model):
    a = ndb.StringProperty(indexed=True)

И у меня есть обработчики для доступа к нему и обновление:

class Handler1:

    my_ds = myDS()
    my_ds.a = "abc" #Trying to update the value

class Handler2:
    my_ds = myDS()
    self.response.write(my_ds.a) #Trying to access my_ds.aafter it was updated in Handlers1

def main():
   application = webapp.WSGIApplication([
           ('/set',   Handler1),
           ('/get',   Handler2])

Я звоню:

Myapp.com/set 
Myapp.com/get : Prints None (Didn't update to "abc")

Почему не обновляется значение?Как я могу обновить через обработчики?

1 Ответ

0 голосов
/ 03 июня 2018

Первое, что нужно отметить, это то, что в Handler1 ваш код фактически не сохраняет сущность в хранилище данных, для этого вам нужно вызвать метод .put():

my_ds = myDS()
my_ds.a = "abc" #Trying to update the value
my_ds_key = my_ds.put()  # save my_ds to the datastore and get its key

ВторойСледует отметить, что в Handler2 вызов my_ds = myDS() не извлекает сущность из хранилища данных, как вы могли бы ожидать, он просто создает вместо нее новую сущность (которая также не сохраняется в хранилище данных).Для извлечения сущности из хранилища данных вам нужно выполнить поиск по ключу сущности (или получить его с помощью запроса):

my_ds = my_ds_key.get()

Это очень основные понятия об использовании хранилища данных, вам, вероятно, нужно получитьбольше знаком с ними.Вам необходимо пройти Создание, извлечение, обновление и удаление объектов (и, возможно, другие связанные главы, сгруппированные в разделе Google Cloud Datastore на левой боковой панели навигации на этой странице документа)

НаконецЧтобы выполнить такой поиск, вам необходимо каким-то образом определить или передать ключ объекта, полученный в Handler1, в Handler2, поскольку каждый запрос к этим обработчикам не зависит друг от друга.Возможный интерес: Передача данных между страницами в функции redirect () в Google App Engine

Пример передачи строкового представления ключа через webapp2 сессий:

InHandler1

my_ds_key = my_ds.put()  # save my_ds to the datastore and get its key
self.session['urlsafe'] = my_ds_key.urlsafe()

In Handler2

urlsafe = self.session.get('urlsafe')
if urlsafe:        
    my_ds = ndb.Key(urlsafe=urlsafe).get()

Пример передачи строкового представления ключа с использованием строки URL-запроса, например /get?urlsafe=<key's urlsafe representation> (может быть хешировано, если хотите, так какбудет отображаться в браузере):

In Handler1

my_ds_key = my_ds.put()  # save my_ds to the datastore and get its key
self.redirect('/get?urlsafe=%s' % my_ds_key.urlsafe())

In Handler2

urlsafe = self.request.get('urlsafe')
if urlsafe:        
    my_ds = ndb.Key(urlsafe=urlsafe).get()

Пример получения объекта в Handler2 череззапрос (в примере предполагается, что правильный объект возвращается запросом)

results = myDS().query().fetch(limit=1)
if results:
    my_ds = results[0]
...