2008-09-15 36 views
3

所以我用GAE做了簡單的「熱身」應用程序。現在我想用更復雜的目錄結構來構建一些東西。沿線的東西:在Google App Engine中尋找相對路徑的好方法是什麼?

siteroot/ 
    models/ 
    controllers/ 
     controller1/ 
     controller2/ 
     ... 
    templates/ 
     template1/ 
     template2/ 
     ... 

..等等。控制器將是Python模塊處理請求。然後他們需要在相關文件夾中找到(Django風格)模板。大多數演示應用程序我看到了這樣的決心模板路徑:

path = os.path.join(os.path.dirname(__file__), 'myPage.html') 

...的__ __文件屬性解析到當前執行腳本。因此,在我上面的例子中,如果一個Python腳本在controllers/controller1 /中運行,那麼'myPage.html'將解析到同一個目錄 - controllers/controller1/myPage.html - 我寧願將我的Python代碼和模板。

我砍死在一起的解決方案感到...哈克:

base_paths = os.path.split(os.path.dirname(__file__)) 
template_dir = os.path.join(base_paths[0], "templates") 

所以,我只是剪斷當前正在運行的腳本的路徑的最後一個元素,並追加模板目錄到新的道路。我見過的用於解析Python路徑的其他(非GAE特定的)解決方案看起來相當重要(例如將路徑拆分爲列表並相應地進行操作)。 Django似乎有這個答案,但我寧願堅持GAE API,與創建一個完整的Django應用程序並修改GAE。

我假設任何硬編碼將是非啓動器,因爲這些應用程序住在Google的無限服務器場中。那麼更好的方法是什麼?

回答

4

不能使用相對路徑,如託尼建議,因爲你沒有保證從工作目錄到應用程序目錄的路徑將保持不變。

正確的解決方法是使用os.path.split這樣的,因爲你,或者使用類似:

path = os.path.join(os.path.dirname(__file__), '..', 'templates', 'myPage.html') 

我通常的做法是用上述方法生成的模板目錄的路徑,並將其存儲爲我的控制器對象的成員,並提供一個「getTemplatePath」方法,該方法使用提供的文件名並將其與基本名稱一起加入。

1

dirname函數返回一個絕對路徑,使用相對路徑。使用os.path.abspath(os.path.curdir)執行控制器時查看當前目錄是什麼,並建立相對於該位置的模板路徑(當然不包括os.path.abspath部分)。

這如果當前目錄裏面siteroot地方只會工作,否則你可能會做這樣的事情:

template_dir = os.path.join(os.path.dirname(__file__), os.path.pardir, "templates") 
相關問題