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

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 .


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 *

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.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.