Получение данных из хранилища данных в GAE - PullRequest
1 голос
/ 12 сентября 2011

Я пытаюсь получить данные из хранилища данных с помощью этого (в примере)

class Book(db.Model):
title = db.StringProperty()
author = db.StringProperty()
category = db.StringProperty()

e = Book(title ="LOTR",
     author = "JRR Tolkien",
     category = "Adventure")

class Result(webapp.RequestHandler):

 Book = db.GqlQuery("SELECT * FROM Book")
    for book in Book:
        self.responce.out.write('<b>%s</b>' % book.title)

Что это решение из примера Google, но есть этот результат

    Traceback (most recent call last):
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 3858, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 3792, in _Dispatch
    base_env_dict=env_dict)
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 580, in Dispatch
    base_env_dict=base_env_dict)
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 2918, in Dispatch
    self._module_dict)
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 2822, in ExecuteCGI
    reset_modules = exec_script(handler_path, cgi_path, hook)
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 2697, in ExecuteOrImportScript
    handler_path, cgi_path, import_hook)
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 2621, in LoadTargetModule
    module_code = compile(source_file.read(), cgi_path, 'exec')
  File "/home/kostas89/library/library.py", line 77
    for book in Book:
   ^
IndentationError: unexpected indent

Я также попробовал метод fetch () безрезультатно.

EDIT: Да, но когда я удаляю отступ, у меня появляется ошибка для «я».

Traceback (most recent call last):
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 3858, in _HandleRequest
    self._Dispatch(dispatcher, self.rfile, outfile, env_dict)
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 3792, in _Dispatch
    base_env_dict=env_dict)
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 580, in Dispatch
    base_env_dict=base_env_dict)
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 2918, in Dispatch
    self._module_dict)
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 2822, in ExecuteCGI
    reset_modules = exec_script(handler_path, cgi_path, hook)
  File "/home/kostas89/google_appengine/google/appengine/tools/dev_appserver.py", line 2702, in ExecuteOrImportScript
    exec module_code in script_module.__dict__
  File "/home/kostas89/library/library.py", line 74, in <module>
    class Result(webapp.RequestHandler):
  File "/home/kostas89/library/library.py", line 79, in Result
    self.responce.out.write('<b>%s</b>' % book.title)
NameError: name 'self' is not defined

Я обнаружил, что вероятно из-за вкладок / пробелов, и я пробую некоторые решения, но все еще не работает.

Ответы [ 5 ]

2 голосов
/ 12 сентября 2011

Свойства внутри вашего класса Book должны иметь отступ.Ваша сущность создается вне метода-обработчика и не сохраняется.Ваш GqlQuery находится внутри обработчика, но не внутри метода, он не имеет правильного отступа, он переназначает переменную, которую вы использовали для своего класса модели, ваш оператор for не имеет правильного отступа и вы ответили с ошибкой.

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

1 голос
/ 13 сентября 2011

Если хотите, вы можете попробовать reindent.py , который проверяет правильность отступа, или инструмент для ворса, такой как pylint . Я нашел реиндент очень полезным, и реиндент, и пилинт, и стоит попробовать.

1 голос
/ 13 сентября 2011

Вы не поместили свой код в метод. Это должно выглядеть примерно так:

class Result(webapp.RequestHandler):
  def get(self):
    Book = db.GqlQuery("SELECT * FROM Book")
    for book in Book:
        self.response.out.write('<b>%s</b>' % book.title)

Также:

  • Кажется, что ваш отступ в вопросе не соответствует тому, что вы на самом деле используете - важно сделать это правильно на языке, таком как Python, где отступ имеет значение.
  • Вы неправильно написали 'ответ'.
  • Это не вернет никаких результатов, потому что вы не вызвали .put() для Book объекта, который вы создали.

Я бы настоятельно рекомендовал пройтись по учебному пособию по App Engine, как предлагает Дрю.

1 голос
/ 12 сентября 2011

Посмотрите на сообщение об ошибке - оно говорит вам правильную вещь:

IndentationError: unexpected indent

Удалите отступ, чтобы получить:

 Book = db.GqlQuery("SELECT * FROM Book")
 for book in Book:
   self.responce.out.write('<b>%s</b>' % book.title)
0 голосов
/ 12 сентября 2011

Я бы удалил отступ:

 Book = db.GqlQuery("SELECT * FROM Book")
 for book in Book:
    self.responce.out.write('<b>%s</b>' % book.title)

как подсказывает ошибка и посмотрим что получится. Скорее всего, как сообщается:

Файл "/home/kostas89/library/library.py", строка 77
для книги в книге:
^ IndentationError: неожиданный отступ

отступ имеет значение в коде Python. Но пробел не обязательно .

...