2016-04-15 84 views
2

我正在使用Flask擴展,從中我想在文件系統的項目根路徑中創建一個目錄。獲取Flask應用程序的根路徑

假設我們有此目錄結構

/project 
    /app 
    /tests 
    /my_folder 
    manage.py 

my_folder應該動態地擴展,這是一種測試工具和下在/測試目錄測試包的應用來創建。但是,我正在努力確定項目在我的擴展中的根路徑。作爲測試從IDE,而不是manage.py內運行,一旦

def root_path(self): 
    # Infer the root path from the run file in the project root (e.g. manage.py) 
    fn = getattr(sys.modules['__main__'], '__file__') 
    root_path = os.path.abspath(os.path.dirname(fn)) 
    return root_path 

這顯然打破了:

現在,我想從運行文件猜的路徑。我可以簡單地推斷項目的根相對於應用程序或測試目錄,但我不想對這些目錄的名稱或結構做任何假設(因爲多個應用程序可能作爲一個包裝中的子包託管)。

我想知道是否有這種類型的問題或Flask對象提供的未記錄方法(如get_root_path)的最佳做法。

回答

9

app.root_path包含應用程序的根路徑。這是基於名稱determined傳遞給Flask。通常,您應該使用instance pathapp.instance_path)而不是根路徑,因爲實例路徑不在包代碼內。

filename = os.path.join(app.instance_path, 'my_folder', 'my_file.txt') 
+1

正是我在找的,謝謝!我的單線解決方案:'root_path = os.path.sep.join(self.app.instance_path.split(os.path.sep)[: - 1])' – thyrel

+1

@thyrel完全錯過了一點:你應該使用'app.instance_path'而不是任何種類的根路徑。如果您確實需要根路徑,請使用'app.root_path'。如果你想在實例路徑上面的路徑,你可以使用'os.path.join(app.instance_path,'..')',儘管你不應該這樣做。 – davidism

相關問題