web-dev-qa-db-fra.com

Obtenir le chemin racine de l'application Flask

Je travaille sur une extension Flask à partir de laquelle je souhaite créer un répertoire dans le chemin racine du projet sur le système de fichiers.

Supposons que nous ayons cette structure de répertoire

/project
    /app
    /tests
    /my_folder
    manage.py

my_folder doit être créé dynamiquement par l'extension, qui est un utilitaire de test et enveloppe l'application testée dans le répertoire/tests. Cependant, j'ai du mal à déterminer le chemin racine du projet dans mon extension.

Pour l'instant, j'essaie de deviner le chemin à partir du fichier d'exécution:

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

Cela se déclenche évidemment dès que les tests sont exécutés depuis IDE au lieu du fichier manage.py. Je pourrais simplement déduire la racine du projet par rapport à l'application ou au répertoire de tests, mais je ne souhaite pas formuler d'hypothèses concernant le nom ou la structure de ces répertoires (car plusieurs applications peuvent être hébergées sous forme de sous-packages dans un seul package).

Je me demandais s'il existe une meilleure pratique pour ce type de problème ou une méthode non documentée fournie par l'objet Flask (telle que get_root_path). 

5
thyrel

app.root_path contient le chemin racine de l'application. Ceci est déterminé en fonction du nom passé à Flask. En règle générale, vous devez utiliser le chemin instance (app.instance_path) et non le chemin racine, car le chemin de l'instance ne sera pas dans le code du package.

filename = os.path.join(app.instance_path, 'my_folder', 'my_file.txt')
16
davidism

app.root_path est le chemin absolu du répertoire racine contenant le code de votre application.

app.instance_path est le chemin absolu du dossier d'instance. os.path.dirname(app.instance_path) est le répertoire au-dessus du dossier d'instance. Au cours du développement , il est identique ou identique au chemin racine, selon la structure de votre projet.

2
Chanpreet Chhabra