L' flaskext.sqlalchemy
module ne doit pas être initialisé avec l'app sur le champ, vous pouvez faire ceci à la place:
# apps.members.models
from flaskext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Member(db.Model):
# fields here
pass
Et puis dans l'installation de votre application, vous pouvez appeler init_app
:
# apps.application.py
from flask import Flask
from apps.members.models import db
app = Flask(__name__)
# later on
db.init_app(app)
De cette façon, vous pouvez éviter cyclique des importations.
Ce modèle ne pas nécessiter la vous placez tous vos modèles dans un seul fichier. Il suffit d'importer le db
variable dans chacun de vos modules de modèle.
Exemple
# apps.shared.models
from flaskext.sqlalchemy import SQLAlchemy
db = SQLAlchemy()
# apps.members.models
from apps.shared.models import db
class Member(db.Model):
# TODO: Implement this.
pass
# apps.reporting.members
from flask import render_template
from apps.members.models import Member
def report_on_members():
# TODO: Actually use arguments
members = Member.filter(1==1).all()
return render_template("report.html", members=members)
# apps.reporting.routes
from flask import Blueprint
from apps.reporting.members import report_on_members
reporting = Blueprint("reporting", __name__)
reporting.route("/member-report", methods=["GET","POST"])(report_on_members)
# apps.application
from flask import Flask
from apps.shared import db
from apps.reporting.routes import reporting
app = Flask(__name__)
db.init_app(app)
app.register_blueprint(reporting)
Note: ceci est une esquisse de certains de la puissance que cela vous donne - il est évidemment tout à fait un peu plus que vous pouvez faire pour assurer un développement encore plus facile (à l'aide d'un create_app
modèle, l'auto-enregistrement des modèles dans certains dossiers, etc.)