main()是否需要在包含处理程序的每个脚本中?

时间:2011-02-05 23:18:55

标签: python google-app-engine httphandler

经验丰富的Java程序员试图学习Python。我在Google App Engine上有一个应用程序,并希望将我的管理员处理程序移动到单独的文件中。所以现在我有main.py和admin.py。我已经设置app.yaml来正确路由流量,并在每个文件中添加了对WSGIApplication()的调用以路由到相应的Handler。

我的问题是每个脚本文件是否需要def main()和相应的if语句:

application = webapp.WSGIApplication([(r'/admin/(.*)', Admin)],
                                       debug=True)

def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

2 个答案:

答案 0 :(得分:4)

您需要在任何直接引用app.yaml

的脚本中使用此功能

每当App Engine需要向您的某个脚本发送请求时,它都会执行以下步骤:

  1. 之前是否已导入脚本?如果没有,只需导入并停止。
  2. 如果以前导入了脚本,它是否有一个名为main的函数?如果没有,请再次导入并停止。
  3. 执行脚本的main功能。
  4. 这样做的原因是因为导入模块相对昂贵,并且没有必要为每个请求重新导入它们。因此,它提供了一个优化:如果你提供一个名为main的函数,在第一个函数之后的请求上,它将简单地执行这个函数而不是重新导入脚本。 if __name__ == "__main__":节用于检测脚本的第一次导入,并为第一个请求手动执行main

    简而言之,答案是您可以同时保留mainif条款,或将它们包括在内。如果你把它们排除在外,你的应用程序的效率会稍微降低,但是如果你包含其中一个而不是另一个,那么你只会遇到麻烦。

答案 1 :(得分:3)

没有必要:你可以拥有:

if __name__ == '__main__':
    run_wsgi_app(application)

我似乎记得读过谷歌推荐main()函数,因为它们以字节编译的形式缓存它,而不是每次请求进入时重新编译文件。虽然它可能没有太大的区别管理员。