【问题标题】:Udacity CS253 using GAE, Handler ErrorsUdacity CS253 使用 GAE,处理程序错误
【发布时间】:2013-12-10 15:49:31
【问题描述】:

我遇到了障碍。碰巧另一名学生艾哈迈德(Ahmad)同时遇到了类似的障碍。到目前为止,我们还没有来自 Udacity 论坛的答案,所以我想我会在这里发帖,希望能早日得到帮助。问题出现在这里:Web Development - Lesson 2 - More Handlers。 (如果您未登录,该链接可能无法使用)。

到目前为止,我们俩都做对了,并取得了进展,但从这里开始,事情就停止了,我们都被难住了。这是我回艾哈迈德的最后一篇文章:

我在 MS Word 中将您的日志与我的日志进行了比较。当您摆脱诸如时间、字体和文件路径之类的东西时,就会出现一些差异。我们都得到了:

警告 api_server.py:331] 无法初始化图像 API;您可能缺少 Python“PIL”模块。

错误 wsgi.py:262]

我们的回溯几乎相同

Traceback(最近一次调用最后一次): 文件“C:\Program Files\ (x86)\Google\google_appengine\google\appengine\runtime\wsgi.py”,第 239 行,在 Handle handler = _config_handle.add_wsgi_middleware(self._LoadHandler()) _LoadHandler 中的文件“C:\Program Files\ (x86)\Google\google_appengine\google\appengine\runtime\wsgi.py”,第 298 行 处理程序,路径,错误 = LoadObject(self._handler) LoadObject 中的文件“C:\Program Files\ (x86)\Google\google_appengine\google\appengine\runtime\wsgi.py”,第 84 行 obj = 导入(路径[0])

但是我们有不同的表单动作 (/<form action ="/testform, TestHandler)],">

我有一个你没有的东西是

警告 2013-12-09 18:18:41,795 simple_search_stub.py:1018] 无法从 c:\users\appdata\local\temp\appengine.udacity7676\search_indexes 读取搜索索引

那么我们从这里去哪里呢?我不知道,但我确实有很多问题希望有人能够并且会回答:

  1. 如果这个 PIL 模块如此重要,为什么要单独下载?为什么 GAE 之前没有告诉我们呢?
  2. 为什么直到现在我们都在 Udacity 测验中取得了成功?换句话说,这个突然让 PIL 变得至关重要的练习有什么不同?
  3. 我在应用引擎网站上查看了 PIL。 https://developers.google.com/appengine/docs/python/images/这是一个图像处理程序,他们给出的例子是带有gae图标的。这让我想知道我们在这节课上的进展是否被要求图标成为结果的一部分的人破坏了?据我所知,这个练习中没有图像,而且我不知道有任何应用程序缺少图标会导致整个事情崩溃。如果真是这样,那就太疯狂了,太浪费了。
  4. 我去了 PIL 下载站点。事实证明,安装程序不仅希望在默认位置 [c:\python27] 找到 Python,而且没有办法给它另一个路径。我试过——很多次。由于我的 python 不在默认位置,要么我不走运,要么我必须在那里重新安装它,然后重新开始。这些工程师在与像我们这样的新手合作时如此灵活,真是太好了和周到了。
  5. 我注意到您说您实际上已经安装了 PIL,但您还是收到了此错误消息。那么我们该怎么做呢?
  6. 我还将课程中的代码与本练习中的代码进行了比较。
  7. 我有MainHandler,他们有MainPage,我注意到了 以前,但我认为这并不重要。另外,我的来了 用这个名字,我没有创建它。
  8. 三重引号的间距似乎不同,但我很确定我在其他地方听说过间距无关紧要,所以这应该不是问题。
  9. 我没有 content-type 行,讲师将其注释掉了。
  10. 他添加了out,如self.response.out.write(form)。这不在我的默认文件中。我只有self.response.write(form)

【问题讨论】:

  • Ashish Nitin Patil 的回答涵盖了其余的要点,但为了完整起见,self.response.out 是 self.response 的别名(它只是返回自身),以便与之前版本的框架,所以任何一个版本都可以。

标签: python google-app-engine python-2.7 python-imaging-library httphandler


【解决方案1】:

(/<form action ="/testform, TestHandler)],"> 看起来不正确。
应该只是 <form action="/testform">

PIL 库对于 GAE 来说根本不是必需的(至少在您的情况下)。所以,这只是一个您可以忽略的警告。 (与你的错误无关)

如果您在末尾的app 声明中使用了正确的处理程序class,则将MainHandler 替换为MainPage 根本不是问题。类似的,

app = webapp2.WSGIApplication([('/', MainPage),
                               ('/testform', TestHandler)],
                              debug=True)

此外,间距无关紧要,但放置 三引号字符串 很重要。例如

form = 
"""
<form action="/testform">
    <input name="q"> <input type="submit">
</form>
"""

会报错,但是,

form =       """
<form action="/testform">
    <input name="q"> <input type="submit">
</form>
"""

这样就可以了。

至于你们两个面临的实际问题,如果我不能看代码,我也帮不了你。如果您希望在 Udacity 论坛上继续讨论,我可以,但是,发布一个链接,我会看看我能做什么。

更新 - 您似乎错过了在 URL-Handlers 声明中添加逗号来分隔元组。你的代码看起来像

app = webapp2.WSGIApplication([('/', MainPage)
                               ('/testform', TestHandler)]
                              debug=True)

应该是的

app = webapp2.WSGIApplication([('/', MainPage), # <-- comma at the end of line
                               ('/testform', TestHandler)], # <-- comma before hash
                              debug=True)

【讨论】:

  • 谢谢阿什。我们可以留在这里。 Udacity 线程上唯一的新帖子是 Ahmad 说他正在操纵他的代码,现在它可以工作了,但他不知道他做了什么,所以他无法帮助我......_sigh_
【解决方案2】:
INFO     2013-12-15 21:18:40,151 module.py:617] default: "GET / 

HTTP/1.1" 500 -
INFO     2013-12-15 21:18:40,190 module.py:617] default: "GET 

/favicon.ico HTTP/1.1" 304 -
ERROR    2013-12-16 03:18:48,500 wsgi.py:262] 

Traceback (most recent call last):

  File "C:\...\appengine\runtime\wsgi.py", line 239, in Handle

    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())

  File "C:\...\appengine\runtime\wsgi.py", line 298, in _LoadHandler

    handler, path, err = LoadObject(self._handler)

  File "C:\...\appengine\runtime\wsgi.py", line 84, in LoadObject

    obj = __import__(path[0])

  File "C:\...\udacity7676\main.py", line 18, in <module>

    ('/testform', TestHandler)],

TypeError: 'tuple' object is not callable

INFO     2013-12-15 21:18:48,512 module.py:617] default: "GET / 

HTTP/1.1" 500 -

我猜处理程序名称不对齐,这就是问题所在,但我宁愿在盲目前进之前获得您的反馈。我也猜想由于同样的原因,元组是不可调用的。但我不记得有任何修改wsgi.py 的说明。我还猜想这个图标错误会出现在这个 PIL 问题上。

【讨论】:

  • 请注意app = webapp2...这行你需要传递一个list的元组给它!验证您的 app 变量是否类似于我上面答案中的变量,例如 ([(), (), ()], debug=True)
  • @Ashish Nitin Patil 对不起。我不明白。首先,如果您查看我在上面发布并链接到的图像文件,您会看到我的 app = webapp2 行与讲师完全相同。如果您的意思是每个部分都应该放在自己的括号中。我试过了,但仍然出现语法错误。
  • Traceback(最近一次调用最后一次):文件“C:\...\google\appengine\runtime\wsgi.py”,第 239 行,在 Handle handler = _config_handle.add_wsgi_middleware(self._LoadHandler ()) 文件“C:\...\appengine\runtime\wsgi.py”,第 298 行,在 _LoadHandler 处理程序中,路径,err = LoadObject(self._handler) 文件“C:\...\google\appengine \runtime\wsgi.py",第 84 行,在 LoadObject obj = __import__(path[0]) 文件 "C:\Users\...\udacity7676\main.py",第 18 行 (/testform),(TestHandler) ], ^ SyntaxError: 无效语法
  • 然后我用单引号和括号都试过了:('/testform'), (TestHandler)], TypeError: 'tuple' object is not callable
  • @AshishNitinPatil 我不认为我最后一次把你的名字写对了。希望您会收到此消息并做出回应。我不知道为什么这些都不起作用。
猜你喜欢
  • 2012-05-19
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多