Structure des applications de ballon
J'essaie de créer une application simple, mais pas triviale avec Flask et je continue à courir dans une situation qui n'est pas bien expliquée dans les docs.
J'aimerais que mon application soit divisée entre différents modules, mais il semble qu'il soit difficile d'accéder à l'objet principal app
(ou db
de flask-sqlalchemy
) depuis un autre endroit que le module principal. Il semble que vous deviez vraiment écrire votre propre façon de le traiter comme un global auquel tout a accès, ce qui nécessite un code douteux et un peu de temps.
Les Deux app
et db
sont créés au niveau où l'application principale est instanciée et chaque exemple suppose qu'ils sont disponibles au niveau supérieur. Mais si je divise différents gestionnaires d'url en différents modules, je perds la possibilité d'utiliser @app.route
décorateur. Je peux contourner cela avec app.add_url_rule('/...', some.module...)
, mais là encore, l'application n'est pas passé à cette fonction.
La même chose se produit avec le db
- Je ne sais pas si je devrais le coller dans g
, ou le rendre accessible via app
en quelque sorte. Cela ne m'aide pas à déplacer les modèles dans un module séparé - Comment suis-je censé accéder à db
lors de leur importation? Tous les exemples supposent à nouveau qu'il est juste disponible en tant que variable locale.
Est-ce que je manque quelque chose d'évident, ou est-ce que j'essaie d'utiliser flask pour la mauvaise tâche ici?
2 réponses
La réponse à votre question Est blueprints. En fait, si vous regardez la documentation, il est mentionné que les plans sont là pour permettre la division de l'application dans les modules.
Exemple de code:
from flask import Blueprint
mod = Blueprint(blueprint_name, __name__, template_folder="folder_name"
static_folder="folder_name")
@mod.route('/mymodule')
def view():
# your code
Dans app.py
from yourmodule import mod
app.register_blueprint(mod)
C'est la bonne façon de diviser application en modules. Consultez les documents blueprint pour plus de détails.
De plus, si vous avez besoin d'accéder à l'application dans un autre module, vous devez utiliser current_app
proxy de l'application.
from flask import current_app