2011-02-05 63 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

相關問題