web-dev-qa-db-fra.com

Puis-je éviter les importations circulaires dans Flask et SQLAlchemy

app/init. py:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__ name __)
db = SQLAlchemy(app)  
from app import views, models

app/models.py:

from app import db  # I want to avoid this everywhere

Je n'aime vraiment pas que mes sous-modules dépendent de leurs parents. Les variables globales du package peuvent-elles également être évitées? Je veux une solution plus OO.

Une alternative pour l'application consiste à utiliser des plans, je pense, mais je perds ensuite le décorateur d'itinéraire. De même, la même chose ne peut pas être faite pour db avec SQLAlchemy (ou est-ce possible?).

21
ovg

Jetez un oeil à ce projet: https://github.com/sloria/cookiecutter-flask
C'est un excellent exemple pour faire les choses correctement. Beaucoup de grandes fonctionnalités Flask sont utilisées: plans, sines d'application et plus encore.

Ici est la façon dont ils enregistrent les extensions, telles que la base de données SQLAlchemy:

# app/extensions.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
...


# app/app.py
from app.extensions import db

def create_app(config_object=ProdConfig):
    app = Flask(__name__.split('.')[0])
    app.config.from_object(config_object)
    register_extensions(app)
    ...

def register_extensions(app):
    db.init_app(app)
    ...
28
leovp

Essayez d'utiliser 3e. Nous créons un fichier exts.py pour instancier SQLAlchemy comme ceci:

exts.py

from flask_sqlalchemy import SQLAlchemy
from flask_xxx import xxx

db = SQLAlchemy()
...

run.py

from flask import Flask

from .exts import db, ...


def register_extensions(app):
    db.init_app(app) 
    ... 


def create_app(config):
    app = Flask(__ name __)
    app.config.from_object(config)

    register_extensions(app)

    return app

app = create_app(config)

models.py

from .exts import db


class XXXModel(db.Model):
    pass    
5
Legolas Bloom