Объект NoneType хранилища данных Google Cloud не имеет атрибута «электронная почта» - PullRequest
0 голосов
/ 08 июня 2018

Когда я пытаюсь получить вид из своего хранилища данных, он возвращает NoneType, как будто запрос пуст.Я знаю, что хранилище данных работает правильно при сохранении, но извлечение вида из запроса - это не так.

Также использование запроса GQL на веб-сайте облачной консоли Google и использование SELECT * FROM User возвращает все виды.У вида пользователя нет родителей, он в корне.Я удостоверился, что все свойства также проиндексированы.

Я не уверен, что я делаю неправильно на GET.

MyApp.py

import webapp2
from google.appengine.ext import ndb
from google.appengine.ext.db import GqlQuery


class MainHandler(webapp2.RequestHandler):

    def post(self):
        message = self.request.body
        message = message.splitlines()

        if message[0] == "register":
            user = User.create_user(message[1], message[2], message[3])
            user_key = User.save_user(user)
            if user_key is not None:
                self.response.write(user_key)

        else:
            user = User.get_by_id(User.email == message[0])
            if User.token == message[1]:
                self.response.write("CURRENT")
            else:
                User.token = message[1]
                User.save_user(user)
                self.response.write("UPDATED")

    def get(self):
        self.response.write("CONNECTED")
        user= User.query().get()
        self.response.write("\n" + query.email)


class User(ndb.Model):
    email = ndb.StringProperty()
    token = ndb.StringProperty()
    name = ndb.StringProperty()

    @classmethod
    def create_user(cls, email, token, name):
        user = User(email=email, token=token, name=name, id=email)
        return user

    @classmethod
    def save_user(cls, user):
        user_key = user.put()
        return user_key

    @classmethod
    def get_user(cls, email):
        return User.get_by_id(User.email == email)


app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)

Ответы [ 2 ]

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

Итак, я понял, что случилось.Так что, похоже, проблема в том, как Google Cloud SDK настроен на моем компьютере.При запуске одного и того же кода на серверах Google, а не в моей сети, все работает нормально.

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

Вы, похоже, путаете .get_by_id() с запросом.

Метод get_by_id фактически сопоставлен с ndb.Model._get_by_id, который вызывает ndb.Model._get_by_id_async, для которого требуется идентификатор ключа объекта, чтобы определить ключ объекта, используемый для прямого поиска объекта (незапрос!).От appengine.ext.ndb.model.py:

  @classmethod
  @utils.positional(3)
  def _get_by_id_async(cls, id, parent=None, app=None, namespace=None,
                       **ctx_options):
    """Returns an instance of Model class by ID (and app, namespace).

    This is the asynchronous version of Model._get_by_id().
    """
    key = Key(cls._get_kind(), id, parent=parent, app=app, namespace=namespace)
    return key.get_async(**ctx_options)

Но в вашем коде вы передаете как id bool: User.email == message[0], что, скорее всего, не будет соответствовать ни одному из существующих ключей объекта.идентификаторы, следовательно, результат None вызывает ошибку, которую вы видите.

Поскольку доступная информация - это значение свойства объекта (значение email), вы, вероятно, хотите выполнить запрос, что-то вродеэти строки:

results = User.query(User.email == message[0]).fetch(limit=1)
if results:
   user = results[0]
...