запрос ndb работает локально в тестировании, но не в развертывании

#python #google-app-engine #app-engine-ndb

#python #google-app-engine #app-engine-ndb

Вопрос:

У меня есть запрос ndb, который работает должным образом локально с помощью Google App Engine Launcher, но когда я развертываю приложение в GAE, запрос не может найти совпадений в базе данных (я создал записи в базе данных одинаково в обеих средах).

Запрос является:

 user = users.get_current_user()
_website_sect_name = 'TVplus_Access'
account_chk = Account.chk_account(user.email(), _website_sect_name)
  

Модели и функции ndb являются:

 DEFAULT_WEBSITE_NAME = 'TVplus_Access'

def access_lvl_key(website_sect_name=DEFAULT_WEBSITE_NAME):
    """Constructs a Datastore key for a Access_lvl entity with website_sect_name."""
    return ndb.Key('Access_lvl', website_sect_name)

class Account(ndb.Model):
    """Models an individual Access_lvl entry."""
    email = ndb.StringProperty(required=True)
    nickname = ndb.StringProperty(indexed=True)
    date = ndb.DateTimeProperty(auto_now_add=True)
    author = ndb.UserProperty()

    @classmethod
    def chk_account(self, _email, _website_sect_name):
        no_acct = 0
        try: 
            website_key = ndb.Key('Access_lvl', _website_sect_name)
            account_email = Account.query(Account.email == _email, ancestor=website_key).order(-Account.date).get().to_dict()
            return account_email
        except:
            return no_acct
  

Функция, которая добавляет пользователей, является:

 class Adduser(webapp2.RequestHandler):
    def post(self):

        website_sect_name = self.request.get('website_sect_name',
                                      DEFAULT_WEBSITE_NAME)
        account = Account(parent=access_lvl_key(website_sect_name))

        if users.get_current_user():
            account.author = users.get_current_user()

        account.email = self.request.get('email')
        account.put()

        account.nickname = self.request.get('nickname')
        account.put()

        query_params = {'website_sect_name': website_sect_name}
        self.redirect('/useradmin?'   urllib.urlencode(query_params))
  

На моем локальном компьютере возвращаемый ответ для Account.chk_account() равен:

{‘date’: datetime.datetime(2014, 7, 2, 22, 6, 22, 854000), ‘ ник’: u’Roger’, ’email’: u’roger@test.com ‘, ‘автор’: пользователи.Пользователь (email=’admin@test.com ‘,_user_id=’123300217217163669814’)}

Но на сервере развертывания функция возвращает код except из «no_acct», равный 0, который сообщает мне, что chk_account () по какой-то причине оказался пустым (учетная запись электронной почты roger@test.com был добавлен в TVplus_Access в обеих средах)

Комментарии:

1. Проверьте журналы вашего движка приложений. Возможно, для этого вам нужно добавить новый индекс хранилища данных.

Ответ №1:

Насколько я помню, в GAE remote control panel есть какой-то инструмент для проверки структуры базы данных и записей. можете ли вы получить к нему доступ и посмотреть, действительно ли добавленная вами учетная запись существует?

Комментарии:

1. Это хорошая идея. Только что проверил средство просмотра хранилища данных, и я вижу запись с правильным идентификатором, электронной почтой, ником и автором. Если я нажимаю на идентификатор, он выводит: «Декодированный ключ объекта: Access_lvl: name=TVplus_Access> Учетная запись: id = 5707702298738688» вместе со свойствами. Это выглядит правильно, но когда я нажимаю «Access_lvl: name=TVplus_Access», он выдает мне ключ сущности, но ниже говорится «Эта сущность не существует» — что, похоже, может быть проблемой?

2. вы создали эту строку вручную или из своего приложения, возможно, возникла проблема с форматированием, если вы сделали это вручную. я бы рекомендовал вам полностью удалить эту строку и добавить ее изнутри приложения. если вы уже сделали это из приложения, попробуйте запросить все записи. посмотрите, включен ли он.

3. Все создано внутри приложения. При просмотре одной из сущностей ‘Account’ в списке нет родительского элемента, поэтому возникает проблема. Я отредактирую вопрос с помощью кода, который создает записи.

Ответ №2:

Проблема была с in chk_account= definition. Удален ‘.order(-Account.date)’ из учетной записи.запрос(). Исправленный раздел кода:

 @classmethod
    def chk_account(self, _email, _website_sect_name):
        no_acct = 0
        try: 
            website_key = ndb.Key('Access_lvl', _website_sect_name)
            account_email = Account.query(Account.email == _email, ancestor=website_key).get().to_dict()
            return account_email
        except:
            return no_acct