ChrisGuest
ChrisGuest

Reputation: 3608

Calling flask app configuration inside models.py

OK, I am trying to do something a little bit esoteric with my Flask application.

I want to have some conditional logic in the model structure that is based on information in a configuration file.

At present when I call my Flask App, a configuration object is specified like this:

app = create_app('swarm.settings.DevConfig')

The db object is created in the models.py :

from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class MyClass(db.Model):
    ...

I would like the models.py to accommodate a variety of ORM and OGM (not limited to SQLAlchemy and py2neo) so that I can develop a Flask app to be SQL/Graph agnostic.

if __SOME_CONFIG__['db_mapper'] = 'SQLAlchemy':
    from flask_sqlalchemy import SQLAlchemy
    db = SQLAlchemy()
    class MapperModel(db.Model):
        ...
elif __SOME_CONFIG__['db_mapper'] = 'Py2Neo':

    from py2neo import Graph, Node, Relation
    db = Graph()
    class MapperModel(py2neo.Node):
        ...

class MyClass(MapperModel):
    ...

I can't see a way to use current_app to achieve this because I am creating my db object before the code is aware of an app object.

Is there a simple way to load the current configuration object from inside models.py ? Should I just load the configuration in models.py from a seperate file in the without reference to the app's current configuration object?

Upvotes: 0

Views: 1030

Answers (1)

metmirr
metmirr

Reputation: 4302

Create a function which will return a db object, and initialize this object when you instantiate flask application:

app = create_app(...)
db = create_dbobject('someconfig')

def create_dbobject(someconfig):
    if someconfig == 'Py2Neo':
        return Py2Neo()
    #default to sqlchemy
    return SQLAlchemy()

So no more you have to worry about extension initialization. And its good to keep extensions initialization in place where app exists.

Upvotes: 1

Related Questions