Das flask_sqlalchemy
Modul muss nicht sofort mit der App initialisiert werden - Sie können dies stattdessen tun:
# apps.members.models
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Member(db.Model):
# fields here
pass
Und dann können Sie in Ihrem Anwendungs-Setup Folgendes aufrufen init_app
:
# apps.application.py
from flask import Flask
from apps.members.models import db
app = Flask(__name__)
# later on
db.init_app(app)
Auf diese Weise können Sie zyklische Importe vermeiden.
Dieses Muster erfordert nicht, dass Sie alle Ihre Modelle in einer Datei platzieren. Importieren Sie einfach die db
Variable in jedes Ihrer Modellmodule.
Beispiel
# apps.shared.models
from flask_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)
Hinweis: Dies ist eine Skizze eines Teils der Leistung, die Sie dadurch erhalten. Offensichtlich können Sie noch einiges mehr tun, um die Entwicklung noch einfacher zu gestalten (mithilfe eines create_app
Musters, automatische Registrierung von Blaupausen in bestimmten Ordnern usw.).
db
Instanz für jede Datenbank erstellen , die Sie haben. Wenn Sie ein Modellpaket haben, können Sie es einlegen__init__.py
. Wie auch immer Sie sich dafür entscheiden, Sie importieren diedb
Variable einfach von diesem Speicherort in Ihre anderen Modelldateien und verwenden sie wie gewohnt. Wenn sie geladen sind, wird alles korrekt aufgelöst..ext.
Namespace ist veraltet - es ist besser, aus dem realen Namespace (flask_sqlalchemy
) zu importieren .ein Original app.py : https://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/
Ich habe nur eine app.py in app.py und model.py aufgeteilt, ohne Blueprint zu verwenden. In diesem Fall funktioniert die obige Antwort nicht. Zum Arbeiten wird ein Zeilencode benötigt.
Vor :
nach dem :
Der folgende Link ist sehr nützlich.
http://piotr.banaszkiewicz.org/blog/2012/06/29/flask-sqlalchemy-init_app/
quelle
db.app = app
bekam Laufzeitfehler, weil init_app die App nicht setzt. +1db.app = app
(gefolgt vondb.init_app(app)
) war das fehlende Stück für mich. Funktioniert perfekt nach dem Hinzufügen dieser Zeile (kombiniert mit Sean Vieiras Antwort)