2016-04-15 20 views
2

私はファイルシステム上のプロジェクトのルートパスにディレクトリを作成するFlask拡張機能を開発中です。Flaskアプリケーションのルートパスを取得

たちは

/project 
    /app 
    /tests 
    /my_folder 
    manage.py 

このディレクトリ構造を持っていると仮定しmy_folderは、テスト・ユーティリティで、/ testsディレクトリにあるテスト対象のアプリケーションをラップ拡張によって動的に作成する必要があります。しかし、私は自分の内線内でプロジェクトのルートパスを決定するのに苦労しています。今の

は、私は、実行ファイルからのパスを推測しようとしています:これは明らかに壊れ

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 

を、すぐにテストが代わりにmanage.pyのIDE内から実行されます。私は単純にアプリケーションやテストのディレクトリに関連するプロジェクトのルートを推測することができますが、複数のアプリケーションが単一パッケージ内のサブパッケージとしてホストされている可能性があるため、これらのディレクトリの名前や構造については何も仮定したくありません。

このタイプの問題や、Flaskオブジェクトが提供するドキュメント化されていないメソッド(get_root_pathなど)のベストプラクティスがあるかどうかは疑問でした。

答えて

9

app.root_pathには、アプリケーションのルートパスが含まれています。これはFlaskに渡された名前に基づいてdeterminedです。通常、インスタンスパスはパッケージコード内にないため、ルートパスではなく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

関連する問題