web-dev-qa-db-fra.com

Flask: Comment lire un fichier dans la racine de l'application?

La structure de mon application Flask ressemble à

application_top/
         application/
                    static/
                          english_words.txt
                    templates/
                             main.html
                     urls.py
                     views.py
         runserver.py

Lorsque j'exécute le runserver.py, le serveur démarre à localhost:5000. Dans mon views.py, j'essaie d'ouvrir le fichier english.txt en tant que

f = open('/static/english.txt')

Cela donne l'erreur IOError: No such file or directory

Comment puis-je accéder à ce fichier?

18
daydreamer

Je pense que le problème est que vous mettez / dans le chemin. Supprimez / car static est au même niveau que views.py.

Je suggère de faire un settings.py du même niveau que views.py ou de nombreux utilisateurs de Flask préfèrent utiliser __init__.py mais je ne le fais pas.

application_top/
    application/
          static/
              english_words.txt
          templates/
              main.html
          urls.py
          views.py
          settings.py
    runserver.py

Si c'est le cas, essayez ceci:

#settings.py
import os
# __file__ refers to the file settings.py 
APP_ROOT = os.path.dirname(os.path.abspath(__file__))   # refers to application_top
APP_STATIC = os.path.join(APP_ROOT, 'static')

Maintenant, dans vos vues, vous pouvez simplement faire:

import os
from settings import APP_STATIC
with open(os.path.join(APP_STATIC, 'english_words.txt')) as f:
    f.read()

Ajustez le chemin et le niveau en fonction de vos besoins.

43
CppLearner

Voici une alternative simple à la réponse de CppLearners:

from flask import current_app

with current_app.open_resource('static/english_words.txt') as f:
    f.read()

Voir la documentation ici: Flask.open_resource

0
jpihl