How to import from config file in Flask?

Question:

I have followed the layout of my Flask project from http://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world.

I have the following structure:

app/
    __init__.py
    views.py
    forms.py
    myFile.py
run.py
config.py

In views.py, forms.py I am able to use

from config import basedir

However I cannot use that in myFile.py

I added

import Flask 

and when I modify it, the Flask web server restarts, but it doesn’t say found changes in app/myFile.py restarting it just restarts.

What do I need to do to be able to use

from config import basedir

in my python file. I don’t see anything special being done in __init__.py for forms.py.

EDIT: This is my __init__.py file:

from flask import Flask
from config import basedir

app = Flask(__name__)
app.config.from_object('config')
from app import views
Asked By: Siecje

||

Answers:

When people talk about configs in Flask, they are generally talking about loading values into the app’s configuration. In your above example you could have something like app.config.from_object('config') in your init.py file. Then all the configuration values will be loaded into the app.config dictionary.

Then in any of your files you could just import the app object to gain access to that dictionary. I tend to access that app object by doing from flask import current_app as app then just app.config['MY_SETTING'] to get the value I care about. Read up more in the documenation.

Answered By: Doobeh

After a little bit of fiddling (and a little help from the ‘net), I could improve this further, by changing the code to include the config to:

app.config.from_object('config.ProductionConfig')

This enables this cool pattern for configurations:

class Config(object):
    DEBUG = True
    DEVELOPMENT = True
    SECRET_KEY = 'do-i-really-need-this'
    FLASK_HTPASSWD_PATH = '/secret/.htpasswd'
    FLASK_SECRET = SECRET_KEY
    DB_HOST = 'database' # a docker link

class ProductionConfig(Config):
    DEVELOPMENT = False
    DEBUG = False
    DB_HOST = 'my.production.database' # not a docker link

What’s left now is to see how to integrate testing configs into this, but at least it feels less clumsy.

Answered By: mrArias

I created a config.json file in my flask project – root folder, like below:

config.json

{
    "mail_settings":{
        "MAIL_SERVER": "smtp.gmail.com",
        "MAIL_PORT": 465,
        "MAIL_USE_TLS": "False",
        "MAIL_USE_SSL": "True",
        "MAIL_USERNAME": "[email protected]",
        "MAIL_PASSWORD": "your_password"
    },
    "database":{
        "MYSQL_HOST":"localhost",
        "MYSQL_USER": "user_name",
        "MYSQL_PASSWORD":"password",
        "MYSQL_DB":"database_name"
    }
}

and just add below code in where we want to access configuration values. for example, i am going to use in app.py like below:

first import flask json library:

import json

second open the file to read and store the json in some variable like below:

with open('config.json') as config_file:
    config_data = json.load(config_file)

add below code after creates a Flask application, named app app = Flask(__name__) like below, for access the config.json – configuration values.

# mail configuration
mail_settings = config_data['mail_settings']
app.config.update(mail_settings)

# database configuration
db_settings = config_data['database']
app.config.update(db_settings)
Answered By: Siva
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.