Python Forum

Full Version: flask: instance config not loaded
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
while building a flask app around an existing database i realized that flask refuse to load the instance specific config.

instance config
# This file contains configuration variables that shouldn’t be in version control.
# This includes things like API keys and database URIs containing passwords.
# This also contains variables that are specific to this particular instance of your application.
# For example, you might have DEBUG = False in config.py, but set DEBUG = True in instance/config.py on your local machine for development.
# Since this file will be read in after config.py, it will override it and set DEBUG = True.

import os

BASEDIR = os.path.abspath(os.path.dirname(__file__))
TOP_LEVEL_DIR = os.path.abspath(os.curdir)

SECRET_KEY = 'cYO13e8bFCMylMAKvicA'
SQLALCHEMY_DATABASE_URI = 'mysql://aix_reg:somepass@localhost/aix_registry'
SQLALCHEMY_TRACK_MODIFICATIONS = False
__init__.py
# This file initializes your application and brings together all of the various components.

# third-party imports
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_admin import Admin
from sqlalchemy import create_engine, MetaData
from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base



# local imports
from config import app_config
from app import models
from app import views
from app import forms

# db variable initialization
db = SQLAlchemy()


"""Reflects all tables to declaratives

  Given a valid engine URI and declarative_base base class
  reflects all tables and imports them to the global namespace.

  Returns a session object bound to the engine created.
"""


def reflect_all_tables_to_declarative(uri):

# create an unbound base our objects will inherit from
    Base = declarative_base()

    engine = create_engine(uri)
    metadata = MetaData(bind=engine)
    Base.metadata = metadata

    g = globals()

    metadata.reflect()

    for tablename, tableobj in metadata.tables.items():
        g[tablename] = type(str(tablename), (Base,), {'__table__' : tableobj })
        print("Reflecting {0}".format(tablename))

    Session = sessionmaker(bind=engine)
    return Session()


def create_app(config_name):
    app = Flask(__name__, instance_relative_config=True)
    app.config.from_object(app_config[config_name])
    app.config.from_pyfile('config.py')
    admin = Admin(app)
    session = reflect_all_tables_to_declarative(SQLALCHEMY_DATABASE_URI)
    db.init_app(app)

    return app
result

* Serving Flask app "run"
 * Forcing debug mode on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 535-055-604
10.133.90.37 - - [28/Jan/2019 15:03:20] "GET /admin/ HTTP/1.1" 500 -
Traceback (most recent call last):
  File "/root/flask/aix_registry/run.py", line 8, in <module>
    app = create_app(config_name)
  File "/root/flask/aix_registry/app/__init__.py", line 59, in create_app
    session = reflect_all_tables_to_declarative(SQLALCHEMY_DATABASE_URI)
NameError: global name 'SQLALCHEMY_DATABASE_URI' is not defined
nobody?
I think
session = reflect_all_tables_to_declarative(SQLALCHEMY_DATABASE_URI)
should be
session = reflect_all_tables_to_declarative(app.config.get('SQLALCHEMY_DATABASE_URI'))
bingo, thank you!

* Serving Flask app "run"
* Forcing debug mode on
Reflecting attribs
Reflecting dyn_table
Reflecting nodes
Reflecting entries
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
Reflecting attribs
Reflecting dyn_table
Reflecting nodes
Reflecting entries
* Debugger is active!