Teilen Sie die Python Flask-App in mehrere Dateien auf

86

Ich habe Probleme zu verstehen, wie eine Kolben-App in mehrere Dateien aufgeteilt wird.

Ich erstelle einen Webdienst und möchte die APIs in verschiedene Dateien (AccountAPI.py, UploadAPI.py, ...) aufteilen, nur damit ich keine große Python-Datei habe.

Ich habe gelesen, dass Sie dies mit Blueprints tun können, bin mir aber nicht ganz sicher, ob die Route für mich die richtige ist.

Letztendlich möchte ich eine Hauptpython-Datei ausführen und andere Dateien einschließen, damit sie beim Ausführen als eine große Datei betrachtet werden.

Wenn ich beispielsweise Main.py und AccountAPI.py habe, möchte ich dies tun können:

Main.py:

from flask import Flask
import AccountAPI

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

AccountAPI.py:

@app.route("/account")
def accountList():
    return "list of accounts"

Ich weiß, dass es mit diesem Beispiel offensichtlich nicht funktioniert, aber ist es möglich, so etwas zu tun?

Vielen Dank

user1751547
quelle

Antworten:

153

Ja, Blaupausen sind der richtige Weg, dies zu tun. Was Sie versuchen zu tun, kann folgendermaßen erreicht werden:

Main.py.

from flask import Flask
from AccountAPI import account_api

app = Flask(__name__)

app.register_blueprint(account_api)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

AccountAPI.py

from flask import Blueprint

account_api = Blueprint('account_api', __name__)

@account_api.route("/account")
def accountList():
    return "list of accounts"

Wenn dies eine Option ist, können Sie verschiedene URL-Präfixe für die verschiedenen APIs / Blueprints verwenden, um sie sauber zu trennen. Dies kann mit einer geringfügigen Änderung des obigen register_blueprintAufrufs erfolgen:

app.register_blueprint(account_api, url_prefix='/accounts')

Weitere Dokumentationen finden Sie auch in den offiziellen Dokumenten .

Cyroxx
quelle
Das hat bei mir perfekt funktioniert, danke! Ich denke, ich hätte die Blueprint-Dokumente sorgfältiger lesen sollen.
user1751547
Hey, ich habe eine Frage. Stimmt die URL für accountList () im folgenden obigen Code mit 'domain / accounts / account' überein?
Jeyraof
4
Können Main.py und AccountAPI.py eine gemeinsame globale Variable haben, die sich in einer der Dateien befindet?
Matchifang
Gibt es eine einfache Lösung, um accountListeine Klasse in dieselbe Datei einzufügen?
GA1
Arbeitete wie ein Zauber, weiter wie man einen geschützten Endpunkt hinzufügt, indem man JWT in separaten .py-Dateien verwendet
Ashok Sri
39

Mit Blueprintkönnen Sie Ihre Routen im routesVerzeichnis hinzufügen .

Struktur

app.py
routes
    __init__.py
    index.py
    users.py

__init__.py

from flask import Blueprint
routes = Blueprint('routes', __name__)

from .index import *
from .users import *

index.py

from flask import render_template
from . import routes

@routes.route('/')
def index():
    return render_template('index.html')

users.py

from flask import render_template
from . import routes

@routes.route('/users')
def users():
    return render_template('users.html')

app.py.

from routes import *
app.register_blueprint(routes)

Wenn Sie beispielsweise eine neue Routendatei hinzufügen möchten accounts.py, müssen Sie nur die Datei accounts.pyim routesVerzeichnis erstellen , genau wie index.pyund users.py, und sie dann in die routes.__init__.pyDatei importieren

from .accounts import *
Searene
quelle
Es wirft einen
Importfehler
Das Importieren in der Mitte der Datei kann als schlechte Praxis angesehen werden?
TomSawyer
3

Wenn Sie Blaupausen verwenden und zu einer URL Ihrer Blaupause innerhalb einer von Ihnen verwendeten Vorlage weiterleiten möchten, müssen Sie die richtige url_for-Anweisung verwenden.

Wenn Sie in Ihrem Fall das URL-Konto Ihrer Blaupause eröffnen möchten, müssen Sie dies in Ihrer Vorlage wie folgt angeben :

href="{{ url_for('account_api.account') }}"

und für die Haupt- App würde es so aussehen:

redirect(url_for('account_api.account'))

Andernfalls gibt die werkzeug Bibliothek einen Fehler aus.

Thomas Krickl
quelle
1

Eine andere Möglichkeit, dies zu tun, kann das verzögerte Laden sein , bei dem Sie Ansichtsfunktionen bei Bedarf explizit anhängen.

Bhaskar
quelle