0

每次加载实例时,我都遇到了 AppEngine 为我提供空白页面的问题。这里已经介绍了类似的问题,但是,没有提到对我的情况有帮助的建设性解决方案。

由于控制台中没有错误,这似乎很难调试,坦率地说我不知道​​如何开始。我没有在上一篇文章中提到过解决方案,因为我不想重命名我的任何文件,并且我想保持我的代码像现在一样有条理。

最后,要问一个更广泛的问题 -每个实例处理的第一个请求和后续请求有什么区别?开发人员有什么需要注意的吗?

那么究竟会发生什么 - 如果第一次加载 appengine 的代码,我会得到一个空白页。随后的每个请求都很好。我想我在那里拥有代码的所有必需部分,以防万一这里是来自 app.yaml 的处理程序(此外,该应用程序使用 python27 作为平台):

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: /fb/.*
  script: fbhandler.py

- url: /xarpc/.*
  script: xmlrpchandler.py

- url: /
  script: main.py

- url: .*
  script: main.py

有问题的处理程序是 fbhandler.py。

def main():
    application = webapp.WSGIApplication([("/fb/", FBHandler)], debug=True)

    util.run_wsgi_app(application)


if __name__ == '__main__':
    main()

如果我检查 appengine 日志,我会看到“空白”请求:

2012-05-07 10:43:14.822 /fb/?id=341108955956205 200 2998ms 0kb Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19
95.23.245.xx - - [07/May/2012:03:43:14 -0700] "POST /fb/?id=xxx HTTP/1.1" 200 0 - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19" "xxx.appspot.com" ms=2999 cpu_ms=563 api_cpu_ms=0 cpm_usd=0.015744 loading_request=1 instance=00c61b117cb0ca2fc61adc3939c4bd034dfa416f
I 2012-05-07 10:43:14.822
This request caused a new process to be started for your application, and thus caused your application code to be loaded for the first time. This request may thus take longer and use more CPU than a typical request for your application.

对于任何好的后续请求,与此相比:

2012-05-07 10:44:05.479 /fb/?id=341108955956205 200 832ms 0kb Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19
95.23.245.xx - - [07/May/2012:03:44:05 -0700] "POST /fb/?id=xxx HTTP/1.1" 200 483 - "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.168 Safari/535.19" "xxx.appspot.com" ms=832 cpu_ms=1272 api_cpu_ms=1078 cpm_usd=0.035497 instance=00c61b117cb0ca2fc61adc3939c4bd034dfa416f

如您所见,任何地方都没有明显的错误消息。

更新:根据建议,我删除了 main() 以尝试排除缓存,现在处理程序如下所示:

application = webapp.WSGIApplication([("/fb/", FBHandler)], debug=True)
util.run_wsgi_app(application)

同样的效果,第一次加载得到空白页,后续加载得到正确的数据。我注意到,是否上传新代码并不重要,如果一个实例正在运行并且我更新了代码,它会在第一次加载时正确显示。我需要进入实例管理员并关闭一个以重现错误。

更新 2:我现在尝试将处理程序更改为新的 python27 方式:

- url: /fb/.*
  script: fbhandler.app

并且对 fbhandler 也进行了相应的更改

import webapp2
app = webapp2.WSGIApplication([("/fb/", FBHandler)])

再次,同样的问题。我也试过删除调试参数没有效果。

4

2 回答 2

3

由于 App Engine 缓存 CGI 处理程序的方式,您会遇到此行为。如果您查看运行时文档(CGI 处理程序脚本也可以缓存部分),您可以看到:

除了导入的模块之外,您还可以告诉 App Engine 缓存 CGI 处理程序脚本本身。如果处理程序脚本定义了一个名为 main() 的函数,则该脚本及其全局环境将像导入的模块一样被缓存。给定 Web 服务器上对脚本的第一个请求通常会评估脚本。对于后续请求,App Engine 会调用缓存环境中的 main() 函数。

为了确保您的处理程序即使在实例启动期间也能正常工作,请务必将您的 WSGI 应用程序定义为全局变量(在 main 之外)。

于 2012-05-07T13:09:26.947 回答
0

解决方案

我现在似乎找到了解决办法。当我将所有应用程序处理程序升级到 webapp2 并使用引用它们的新方法时,它现在似乎可以在没有第一次加载错误的情况下工作。

于 2012-05-14T19:27:10.447 回答