Being deployment-specific with the instance folder
Flask provides yet another method for configuration, where we can efficiently manage deployment-specific parts. Instance folders allow us to segregate deployment-specific files from our version-controlled application. We know that configuration files can be separate for different deployment environments, such as development and production, but there are also many more files, such as database files, session files, cache files, and other runtime files. In this recipe, we will create an instance folder that will act like a holder container for such kinds of files. By design, the instance folder will not be a part of the version control system.
How to do it...
By default, the instance folder is picked up from the application automatically if we have a folder named instance
in our application at the application level, as follows:
my_app/ app.py instance/ config.cfg
We can also explicitly define the absolute path of the instance folder by using the instance_path
parameter on our application object, as follows:
app = Flask( __name__, instance_path='/absolute/path/to/instance/folder')
To load the configuration file from the instance folder, we can use the instance_relative_config
parameter on the application object, as follows:
app = Flask(__name__, instance_relative_config=True)
This tells the application to load the configuration file from the instance folder. The following example shows how to configure this:
app = Flask( __name__, instance_path='path/to/instance/folder', instance_relative_config=True ) app.config.from_pyfile('config.cfg', silent=True)
How it works...
In the preceding code, first, the instance folder is loaded from the given path; then, the configuration file is loaded from the config.cfg
file in the given instance folder. Here, silent=True
is optional and is used to suppress the error if config.cfg
is not found in the instance folder. If silent=True
is not given and the file is not found, then the application will fail, giving the following error:
IOError: [Errno 2] Unable to load configuration file (No such file or directory): '/absolute/path/to/config/file'
Information
It might seem that loading the configuration from the instance folder using instance_relative_config
is redundant work and could be moved to one of the configuration methods itself. However, the beauty of this process lies in the fact that the instance folder concept is completely independent of configuration, and instance_relative_config
just complements the configuration object.