2011-02-05 62 views
2

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

我的问题是确实每个脚本文件需要高清main()和if语句对应:

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

def main(): 
    run_wsgi_app(application) 

if __name__ == '__main__': 
    main() 
+1

没有什么能够阻止你在app.yaml中根据路径在不同的权限级别上列出两次相同的脚本文件。 – Matt 2011-02-06 06:21:48

回答

4

在任何直接引用您的app.yaml的脚本中都需要此脚本。

任何时候,App Engine的需要发送到脚本的一个请求时,它会通过以下步骤:

  1. 一直脚本之前已经进口的?如果没有,只需导入并停止。
  2. 如果脚本之前已被导入,它是否具有一个名为main的函数?如果没有,再次导入并停止。
  3. 执行脚本的main函数。

这样做的原因是因为导入模块相对昂贵,并且没有必要为每个请求重新导入它们。因此,它提供了一种优化:如果您提供了一个名为main的函数,那么在第一个函数之后的请求中,它将简单地执行此函数而不是重新导入脚本。 if __name__ == "__main__":节用于检测脚本的第一次导入,并为该第一次请求手动执行main

简而言之,答案是您可以将mainif条款都删除,也可以同时包含它们。如果你将它们排除在外,你的应用程序效率会稍差,但如果包含其中一个而不是另一个,则只会遇到麻烦。

3

这是没有必要的:你可以只是有:

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

我似乎记得读Google建议使用main()函数,因为它们以字节编译形式缓存它,而不是每次请求进入时重新编译该文件。尽管它对于管理员来说可能没有多大区别。

+0

稍微改写一下,不需要`main()`方法,但需要`if __name__ =='__main __'`block *。 – 2011-02-06 18:28:03

+0

@Luke:这取决于Google的设置。 `if __name__`技巧检查您是否导入或运行它,并且我不确切知道Google做了什么。但我肯定会推荐使用它。 – 2011-02-06 18:55:55

相关问题