webentwicklung-frage-antwort-db.com.de

So teilen Sie das globale App-Objekt in der Flasche

Ich benutze eine Flasche und versuche folgendes. 

Ich habe eine main.py-Datei definiert, durch die ich meine App ausführen möchte, z. B. 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()

Ich habe ein Paket namens view definiert, in dem ich meine verschiedenen Ansichtsmodule mit jeweils eigenen Routen deklarieren werde. view.tags.py -

from flask import Flask
app = Flask(__name__)

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

Ich brauche also das globale App-Objekt in main.py, um den Server auszuführen, und in den Ansichtsklassen meines Pakets, um die Routen zu registrieren. Wie erstelle ich also das globale App-Objekt und teile es zwischen allen Klassen?

Danke, Murtaza 

21
murtaza52

Eine Möglichkeit besteht darin, ein Gesamtpaket zu erstellen und eine __init__.py-Datei unter derjenigen hinzuzufügen, in der Sie alle globalen Variablen deklarieren. In Ihrem Fall können Sie beispielsweise Folgendes erstellen:

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

usw

Jetzt fügen Sie der __init__.py-Datei den folgenden Code hinzu:

app = Flask(__name__)

Sie können diese App-Variable jetzt überall verwenden, solange Sie das Paket myapplication importieren.

import myapplication.myviews.view
10
codegeek

Sie können current_app aus der Flasche importieren. Es speichert eine Referenz auf das globale Anwendungsobjekt.

from flask import current_app as app

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

Zuerst würde ich vorschlagen, einen Blick auf Blueprints http://flask.pocoo.org/docs/blueprints/ zu werfen. Dies hilft, die App auf einfache Weise zu organisieren.

Schauen Sie sich auch unter http://flask.pocoo.org/docs/api/#flask.current_app flask.current_app an, wie Sie Ihre App-Instanz in anderen Modulen erhalten.

Dieser Link könnte auch hilfreich sein, um eine Flaschen-App zu organisieren und zu erstellen (dies ist nicht unbedingt sicher, kann aber einige Ideen geben) https://github.com/mitsuhiko/flask/wiki/Large-app-how -zu

Habe Spaß :)

18
Ignas Butėnas

Importiere es einfach aus deinen anderen Dateien. Möglicherweise ist dies der beste Weg, Ihr App-Objekt in einer einzigen Datei zu speichern und alles andere daraus importieren zu lassen.

Zum Beispiel könnte Ihr main.py noch Folgendes haben:

from flask import Flask
from view import tags

app = Flask(__name__)

Und dann in anderen Dateien könnten Sie Folgendes tun:

from .main import app

wenn Sie sich außerhalb Ihres Pakets befinden, verwenden Sie einfach die vollständige Zeichenfolge

from mypackagename.main import app

Eine Sache, vor der man vorsichtig sein sollte, ist das zirkuläre Importieren. Der einfachste Weg, um dieses Problem zu lösen, besteht darin, zuerst Ihre App zu erstellen und anschließend alles, was Sie sonst noch benötigen, aus Ihrer Basisdatei zu importieren, nachdem Sie erstellt haben.

Also zum Beispiel:

from flask import Flask
app = Flask(__name__)

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

Solange Sie die Importe nach der von Ihnen erstellten App (wie oben) ablegen, sollten Sie kein Problem mit dem zirkularen Import haben.

9
Jeff Tratner

Bezüglich des Imports und der Verwendung von current_app aus flask in einer "Helfer" -Python-Funktion in einer separaten Quelldatei funktioniert dies, solange ein aktueller App-Kontext eingerichtet wurde (z. B. Webanforderung empfangen). Ich habe einen Fall, in dem app.logger während der Anwendungsinitialisierung (app.run noch nicht aufgerufen) in der Hilfsfunktion aufgerufen wird. 

Bevor ich das Problem behoben habe (siehe unten), habe ich einen Stack-Trace erhalten, der durch "RuntimeError: Außerhalb des Anwendungskontexts arbeiten" gekennzeichnet ist.

Musterlösung:
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

Wenn Sie eine Datei AppName.py haben, in der Sie app definieren, und Sie eine andere Datei Foobar.py haben, die sie benötigt, können Sie immer in AppName.py sagen:

import Foobar
Foobar.app = app

In Foobar.py sollten Sie dann die App in Ihren Funktionen verwenden können. Sie sollten aufpassen, dass Sie keinen Code in Foobar.py haben können, der sofort ausgeführt wird, wenn die Datei aufgerufen wird. Sie hängt von der app-Variablen ab, die nach dem Import übergeben wird.

0
Kvass