Je souhaite structurer mon application Flask quelque chose comme:
./site.py
./apps/members/__init__.py
./apps/members/models.py
apps.members
est un plan de flacon.
Maintenant, pour créer les classes de modèle, j'ai besoin d'avoir une emprise sur l'application, quelque chose comme:
# apps.members.models
from flask import current_app
from flaskext.sqlalchemy import SQLAlchemy
db = SQLAlchemy(current_app)
class Member(db.Model):
# fields here
pass
Mais si j'essaie d'importer ce modèle dans mon application Blueprint, j'obtiens le redouté RuntimeError: working outside of request context
. Comment puis-je accéder correctement à mon application ici? Les importations relatives peuvent fonctionner mais elles sont assez laides et ont leurs propres problèmes de contexte, par exemple:
from ...site import app
# ValueError: Attempted relative import beyond toplevel package
la source
db
instance pour chaque base de données que vous avez. Si vous avez un ensemble de modèles, vous pouvez le mettre__init__.py
. Quelle que soit la manière dont vous choisissez de le faire, il vous suffit d'importer ladb
variable de cet emplacement dans vos autres fichiers de modèle et de l'utiliser normalement. Lorsqu'ils sont chargés, tout se résout correctement..ext.
espace de noms est obsolète - il est préférable d'importer depuis l'espace de noms réel (flask_sqlalchemy
).un app.py original : https://flask-sqlalchemy.palletsprojects.com/en/2.x/quickstart/
Je viens de diviser un app.py en app.py et model.py sans utiliser Blueprint. Dans ce cas, la réponse ci-dessus ne fonctionne pas. Un code de ligne est nécessaire pour fonctionner.
avant :
après :
Et, le lien suivant est très utile.
http://piotr.banaszkiewicz.org/blog/2012/06/29/flask-sqlalchemy-init_app/
la source
db.app = app
obtenait une erreur d'exécution car init_app ne définit pas l'application. +1db.app = app
(suivi dedb.init_app(app)
) était la pièce manquante pour moi. Fonctionne parfaitement après avoir ajouté cette ligne (combinée à la réponse de Sean Vieira)