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?).
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)
...
Essayez d'utiliser 3e. Nous créons un fichier exts.py pour instancier SQLAlchemy comme ceci:
from flask_sqlalchemy import SQLAlchemy
from flask_xxx import xxx
db = SQLAlchemy()
...
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)
from .exts import db
class XXXModel(db.Model):
pass