Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Unable to load configuration file from instance folder when deploying app

Tags:

python

flask

I set up a new virtualenv for my app, to clean up the installed packages. I have a config.py file in the app's instance folder. There are two configs, one for dev in the 'instance' folder and one for production in the root folder. The app worked in the old env, but now I get an error that it couldn't find the config file. Why am I getting this error and how do I fix it?

Traceback (most recent call last):
  File "application.py", line 12, in <module>
    application.config.from_pyfile('config.py')
  File "/Users/pavsidhu/Envs/test/lib/python2.7/site-packages/flask/config.py", line 128, in from_pyfile
    with open(filename) as config_file:
IOError: [Errno 2] Unable to load configuration file (No such file or directory): '/Users/pavsidhu/Envs/test/var/application-instance/config.py'

My project structure looks like:

/Users/pavsidhu/Envs/test/
    lib/python-3.4/site-packages/
    bin/
    application.py
    static/
    templates/
    instance/
        config.py
like image 523
Pav Sidhu Avatar asked Jul 01 '15 14:07

Pav Sidhu


People also ask

What is instance folder?

The instance folder is a sub-directory of the repository root and contains a configuration file specifically for this instance of the application. We don't want to commit it into version control. config.py requirements.txt run.py instance/ config.py yourapp/ __init__.py models.py views.py templates/ static/

What is the configuration file for the application?

An application configuration file contains settings that are specific to an app. This file includes configuration settings that the common language runtime reads (such as assembly binding policy, remoting objects, and so on), and settings that the app can read.


1 Answers

Flask thinks your app is installed in the env because you put it in the same base directory as the env. This behavior is described in detail in the docs.

Installed module or package:

$PREFIX/lib/python2.X/site-packages/myapp
$PREFIX/var/myapp-instance

$PREFIX is the prefix of your Python installation.

Flask expects the instance folder to be at var/myapp-instance when installed this way. (The structure isn't exactly the same, but it's similar enough to fool Flask's detection function.)

You should not mix your project structure with the virtualenv structure. Separate the two:

my_env/
    lib/
    bin/
my_project/
    my_app/
        __init__.py
        static/
        templates/
    instance/

See the comment discussion moved to chat for further details.

like image 107
davidism Avatar answered Sep 20 '22 03:09

davidism