web-dev-qa-db-fra.com

Comment partager l'objet global de l'application dans un flacon?

J'utilise un flacon et j'essaie ce qui suit. 

J'ai défini un fichier main.py à travers lequel je veux exécuter mon application, c'est-à-dire python main.py -

from flask import Flask
from view import tags

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __== '__main__':
    app.run()

J'ai défini un paquet nommé view dans lequel je vais déclarer mes différents modules de vue, chacun ayant ses propres routes. view.tags.py -

from flask import Flask
app = Flask(__name__)

@app.route('/e')
def hello_world2():
    return 'Hello World!'

Donc, je dois avoir l'objet global app dans mon main.py pour exécuter le serveur, ainsi que dans les classes d'affichage de mon paquet pour enregistrer les routes. Alors, comment puis-je créer l'objet d'application global et le partager entre toutes les classes?

Merci, Murtaza 

21
murtaza52

Une solution consiste à créer un package global et à ajouter un fichier __init__.py sous celui dans lequel vous déclarez toutes les variables globales. Dans votre cas, par exemple, vous pouvez créer quelque chose comme:

myapplication/
    *        __init__.py
    *        myviews/
        *         __init__.py
        *         view.py
        *         tags.py

etc

Maintenant, vous ajoutez le code suivant dans le fichier __init__.py:

app = Flask(__name__)

Vous pouvez maintenant utiliser cette variable d'application n'importe où, tant que vous importez le package myapplication.

import myapplication.myviews.view
10
codegeek

Vous pouvez importer current_app depuis une bouteille. Il stocke une référence à l'objet d'application global.

from flask import current_app as app

def home():
    return render_template('base.html', name=app.name)
31
Juan Odicio

Tout d'abord, je suggérerais de jeter un coup d'œil à Blueprints http://flask.pocoo.org/docs/blueprints/ / Cela vous aidera à organiser l'application facilement.

Jetez également un coup d'œil à http://flask.pocoo.org/docs/api/#flask.current_app flask.current_app, comment obtenir votre instance d'application dans d'autres modules.

Ce lien pourrait également être utile pour organiser et créer une application de flacon (ce n’est certes pas idéal, mais peut vous donner des idées) à

S'amuser :)

18
Ignas Butėnas

Importez-le simplement de vos autres fichiers. La meilleure façon de le faire est peut-être de placer votre objet d'application dans un seul fichier et de faire en sorte que tout le reste soit importé.

Par exemple, votre main.py pourrait encore avoir:

from flask import Flask
from view import tags

app = Flask(__name__)

Et puis dans d'autres fichiers, vous pourriez faire:

from .main import app

ou, si en dehors de votre paquet, utilisez simplement la chaîne complète

from mypackagename.main import app

Une chose à faire attention est les importations circulaires. Le moyen le plus simple de gérer ce problème consiste à créer d'abord votre application, puis à importer tout ce dont vous avez besoin à partir de votre fichier de base après vous le créez.

Donc par exemple:

from flask import Flask
app = Flask(__name__)

# do some stuff with app
from .views import view1, view2
from .server import run

Tant que vous placez les importations après vous avez créé une application, comme ci-dessus, vous ne devriez pas avoir de problème avec les importations circulaires.

9
Jeff Tratner

En ce qui concerne l'importation et l'utilisation de current_app depuis un flacon dans une fonction "assistant" python dans un fichier source séparé, cela fonctionne tant qu'un contexte d'application actuel a déjà été défini (demande Web reçue, par exemple). J'ai un cas où, lors de l'initialisation de l'application (app.run pas encore appelé), app.logger est appelé dans la fonction d'assistance. 

Avant de résoudre ce problème (voir ci-dessous), une trace de pile ponctuée de "RuntimeError: Travailler en dehors du contexte de l'application".

Solution échantillon:
main.py:

import helper
...
app = Flask(__name__.split('.')[0],
        template_folder="templates",
        static_folder="static")
... 
# Fix: Create an app context
with app.app_context():
    helper.dbopen(...)
...
app.run(...)

helper.py:

from flask import current_app as app
...
def dbopen():
    app.logger.info(...)
    ...
1
Richard Elkins

Si vous avez un fichier AppName.py dans lequel vous définissez app et que vous avez un autre fichier Foobar.py qui en a besoin, vous pouvez toujours dire dans AppName.py:

import Foobar
Foobar.app = app

Ensuite, dans Foobar.py, vous devriez pouvoir utiliser l'application dans vos fonctions. Une chose à laquelle vous voulez faire attention est que vous ne pouvez pas avoir de code dans Foobar.py qui est exécuté immédiatement lorsque le fichier est appelé dépend de la variable app qui est transmise après l'importation.

0
Kvass