Flask: How to read a file in application root?


Question

My Flask application structure looks like

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

When I run the runserver.py, it starts the server at localhost:5000. In my views.py, I try to open the file english.txt as

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

It gives error IOError: No such file or directory

How can I access this file?

1
18
2/12/2013 5:10:29 AM

Accepted Answer

I think the issue is you put / in the path. Remove / because static is at the same level as views.py.

I suggest making a settings.py the same level as views.py Or many Flask users prefer to use __init__.py but I don't.

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

If this is how you would set up, try this:

#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')

Now in your views, you can simply do:

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

Adjust the path and level based on your requirement.

45
2/12/2013 5:45:12 AM

Here's a simple alternative to CppLearners answer:

from flask import current_app

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

See the documentation here: Flask.open_resource


Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow
Icon