#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