Странная ошибка в Google App Engine - PullRequest
0 голосов
/ 11 ноября 2009

Я хотел бы отметить, что я новичок в Python, а с ним и в Python на платформе GAE. Я обнаружил эту очень странную ошибку / ошибку, когда я пытаюсь получить объект, используя его идентификатор ключа ... Вот что я делаю,

Я запрашиваю модель сущностей хранилища данных UserDetails для ключа, соответствующего имени пользователя, полученному из пользовательского интерфейса.

src_key_str = db.GqlQuery('SELECT __key__ FROM UserDetails WHERE user_name = :uname', uname = src_username).fetch(1)
for itr1 in src_key_str:
          src_key = itr1.id_or_name()

Затем, используя полученный src_key, я пытаюсь получить объект, соответствующий тому же.

accounts = UserDetails.get_by_id(src_key)

Теперь, когда я пытаюсь получить доступ к свойствам учетных записей, используя self.response.out.write(accounts.user_name), я получаю ошибку AttributeError: 'list' object has no attribute 'user_name'. Думая, что аккаунты на самом деле были списком, я попытался получить первый элемент, используя accounts[0] Теперь я получаю list out of bound error.

Когда я пытаюсь жестко запрограммировать значение src_key, оно работает просто отлично, но когда я передаю значение тому же методу, я получаю эти ошибки. Я не понимаю, почему GAE ведет себя так в производственной среде и среде разработки. Мне не хватает информации об этом поведении?

РЕДАКТИРОВАТЬ : добавление трассировки стека,

Traceback (most recent call last):
  File "/base/python_lib/versions/1/google/appengine/ext/webapp/__init__.py", line 507, in __call__
    handler.get(*groups)
  File "/base/data/home/apps/bulkloader160by2/1-5.337673425692960489/new_main.py", line 93, in get
    self.response.out.write(accounts.user_name)
AttributeError: 'list' object has no attribute 'user_name'

1 Ответ

1 голос
/ 11 ноября 2009

Вы получаете эту ошибку, потому что «account» - это список, а не отдельный экземпляр. Исходя из вашего кода, я не понимаю, почему это так, но попробуйте сделать следующее:

src_key = db.GqlQuery('SELECT __key__ FROM UserDetails WHERE user_name = :uname', uname = src_username).get()
if src_key:
  account = UserDetails.get(src_key)

Нет причин вызывать .fetch (), когда вам нужен только один объект, и нет также причины извлекать идентификатор, просто чтобы передать его в .get_by_id. Фактически, если показанный вами фрагмент - это все, что вы делаете, проще и быстрее будет:

account = db.GqlQuery('SELECT * FROM UserDetails WHERE user_name = :uname', uname = src_username).get()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...