AppEngine在第一个请求中提供空白页面 - 第一个和后续实例加载之间有什么区别?

时间:2012-05-07 11:14:42

标签: python google-app-engine

每次加载实例时,AppEngine都会向我提供一个空白页面。 这是类似的问题已经涵盖here,但是,没有提到任何有助于我的案例的建设性解决方案。

由于控制台中没有错误,这个似乎非常难以调试,我坦率地不知道如何启动。我没有上一篇文章中提到的解决方案,因为我不想重命名我的任何文件,而且我希望保持我的代码现在有条理。

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

那究竟发生了什么 - 如果第一次加载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)

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

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

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

还有对fbhandler的相应更改

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

同样,同样的问题。我也尝试删除调试参数而没有任何效果。

2 个答案:

答案 0 :(得分:3)

由于App Engine缓存CGI处理程序的方式,您遇到此行为。 如果你查看runtime documentation(CGI处理程序脚本也可以缓存 你可以看到:

  

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

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

答案 1 :(得分:0)

<强>解

我现在似乎找到了解决方案。当我将所有应用程序处理程序升级到webapp2并使用新的引用方式时,它现在似乎没有第一个加载错误。