Teraz, aby stworzyć klasy modelowe, potrzebuję posiadać aplikację w stylu:
# apps.members.modelsfrom flask import current_app
from flaskext.sqlalchemy importSQLAlchemy
db =SQLAlchemy(current_app)classMember(db.Model):# fields herepass
Ale jeśli spróbuję zaimportować ten model do mojej aplikacji Blueprint, jestem przerażony RuntimeError: working outside of request context. Jak mogę tutaj poprawnie uzyskać dostęp do mojej aplikacji? Importy względne mogą działać, ale są dość brzydkie i mają własne problemy z kontekstem, np .:
# apps.applicationfrom flask importFlaskfrom apps.shared import db
from apps.reporting.routes import reporting
app =Flask(__name__)
db.init_app(app)
app.register_blueprint(reporting)
Uwaga: to jest szkic niektórych mocy, które ci to daje - jest oczywiście znacznie więcej, co możesz zrobić, aby jeszcze bardziej ułatwić programowanie (użycie create_appwzoru, automatyczna rejestracja planów w niektórych folderach itp.)
Czy możesz to zrobić wiele razy? Na przykład, jeśli mam więcej niż jeden plik models.py?
Brad Wright,
@BradWright - będzie to łatwiejsze, jeśli utworzysz tylko dbinstancję dla każdej posiadanej bazy danych. Jeśli masz pakiet modeli, możesz go włożyć __init__.py. Jakkolwiek zdecydujesz się to zrobić, po prostu importujesz dbzmienną z tego miejsca do innych plików modelu i używasz jej jak zwykle. Po załadowaniu wszystko przebiega poprawnie.
Sean Vieira
1
Czy miałbyś link do projektu, który jest skonfigurowany w ten sposób?
...
app = flask.Flask(__name__)
app.config['DEBUG']=True
app.config['SQLALCHEMY_DATABASE_URI']='sqlite:////tmp/test.db'
db = flask.ext.sqlalchemy.SQLAlchemy(app)classPerson(db.Model):
id = db.Column(db.Integer, primary_key=True)...classComputer(db.Model):
id = db.Column(db.Integer, primary_key=True)...# Create the database tables.
db.create_all()...# start the flask loop
app.run()
Właśnie podzieliłem jeden plik app.py na app.py i model.py bez korzystania z Blueprint. W takim przypadku powyższa odpowiedź nie działa. Do działania potrzebny jest kod linii.
db.app = apppojawiał się błąd w czasie wykonywania, ponieważ init_app nie ustawił aplikacji. +1
Amit Tripathi
3
db.app = app(a następnie db.init_app(app)) był dla mnie brakującym elementem. Działa idealnie po dodaniu tej linii (w połączeniu z odpowiedzią Seana Vieiry)
db
instancję dla każdej posiadanej bazy danych. Jeśli masz pakiet modeli, możesz go włożyć__init__.py
. Jakkolwiek zdecydujesz się to zrobić, po prostu importujeszdb
zmienną z tego miejsca do innych plików modelu i używasz jej jak zwykle. Po załadowaniu wszystko przebiega poprawnie..ext.
nazw jest przestarzała - lepiej importować ją z prawdziwej przestrzeni nazw (flask_sqlalchemy
).oryginalny app.py : https://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/
Właśnie podzieliłem jeden plik app.py na app.py i model.py bez korzystania z Blueprint. W takim przypadku powyższa odpowiedź nie działa. Do działania potrzebny jest kod linii.
przed :
po :
Poniższy link jest bardzo przydatny.
http://piotr.banaszkiewicz.org/blog/2012/06/29/flask-sqlalchemy-init_app/
źródło
db.app = app
pojawiał się błąd w czasie wykonywania, ponieważ init_app nie ustawił aplikacji. +1db.app = app
(a następniedb.init_app(app)
) był dla mnie brakującym elementem. Działa idealnie po dodaniu tej linii (w połączeniu z odpowiedzią Seana Vieiry)