【问题标题】:Retrieving data from a datastore in GAE从 GAE 中的数据存储中检索数据
【发布时间】:2011-09-12 16:05:22
【问题描述】:

我正在尝试使用这个从数据存储中检索数据 (例如)

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)

这个解决方案来自谷歌示例,但有这个结果

    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() 方法没有任何结果..

编辑: 是的,但是当我删除缩进时,“自我”出现错误。

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

我发现这可能是因为标签/sapces,我尝试了一些解决方案但仍然无法正常工作。

【问题讨论】:

    标签: google-app-engine google-cloud-datastore


    【解决方案1】:

    Book 类中的属性应该缩进。您的实体在处理程序方法之外被实例化并且没有被保存。您的 GqlQuery 位于处理程序内部但不在方法内部,它没有正确缩进,它重新分配了您用于模型类的变量,您的 for 语句没有正确缩进,并且您拼写错误的响应。

    无意冒犯,但您可能需要备份并完成App Engine Getting Started 教程。完成这些示例后,进行小的增量更改并验证代码在每个示例之后仍然运行。

    【讨论】:

    • 最后,我做到了(我的例子与我的实际问题有点不同)。这是我眼前的错误。你知道当你有压力的时候,你正在做一些荒谬的错误。我会休息几天,我会以清醒的头脑继续我的项目。谢谢。
    【解决方案2】:

    查看报告的错误 - 它告诉你正确的事情:

    IndentationError: unexpected indent
    

    去掉缩进,产生:

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

    【讨论】:

    • 是的,但是当我删除缩进时,“自我”出现错误。文件“/home/kostas89/library/library.py”,第 78 行,在书的结果中:self.responce.out.write('%s' % book.title) NameError:名称“自我”未定义我发现这可能是因为标签/空间,我尝试了一些解决方案但仍然无法正常工作。
    • 对于初学者:将响应替换为响应,并将执行查询的代码放在 def get(self) 中,以便定义 self。看这里:code.google.com/appengine/docs/python/gettingstarted/…
    【解决方案3】:

    您还没有将代码放入方法中。它应该看起来像这样:

    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 等缩进很重要的语言中正确处理这一点很重要。
    • 您拼错了“响应”。
    • 这不会返回任何结果,因为您没有在您创建的 Book 实体上调用 .put()

    我强烈建议您按照 Drew 的建议完成 App Engine 教程。

    【讨论】:

      【解决方案4】:

      如果需要,您可以尝试使用reindent.py 确保缩进正确或使用 lint 工具,例如 pylint。我发现 reindent 非常有用,reindent 和 pylint 都值得一试。

      【讨论】:

        【解决方案5】:

        我会删除缩进:

         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: 意外缩进

        indentation is significant 在 python 代码中。但是white space is not necessarily

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多