Wie teile ich die Kolben-App in mehrere Py-Dateien?

146

Meine Kolbenanwendung besteht derzeit aus einer einzelnen test.pyDatei mit mehreren Routen und der main()definierten Route. Gibt es eine Möglichkeit, eine test2.pyDatei zu erstellen , die Routen enthält, die nicht verarbeitet wurden test.py?

@app.route('/somepath')
def somehandler():
    # Handler code here

Ich test.pymache mir Sorgen, dass es zu viele Routen gibt, und möchte es so gestalten, dass ich es ausführen kann. python test.pyDadurch werden die Routen auch so aufgenommen, test.pyals ob sie Teil derselben Datei wären. Welche Änderungen muss ich vornehmen test.pyund / oder einbeziehen test2.py, damit dies funktioniert?

Rolando
quelle

Antworten:

152

Sie können die übliche Python-Paketstruktur verwenden, um Ihre App in mehrere Module aufzuteilen. Weitere Informationen finden Sie in den Flask-Dokumenten.

Jedoch,

Flask verwendet ein Konzept von Blaupausen, um Anwendungskomponenten zu erstellen und allgemeine Muster innerhalb einer Anwendung oder zwischen Anwendungen zu unterstützen.

Sie können eine Unterkomponente Ihrer App als Blaupause in einer separaten Datei erstellen:

simple_page = Blueprint('simple_page', __name__, template_folder='templates')
@simple_page.route('/<page>')
def show(page):
    # stuff

Und dann benutze es im Hauptteil:

from yourapplication.simple_page import simple_page

app = Flask(__name__)
app.register_blueprint(simple_page)

Blaupausen können auch bestimmte Ressourcen bündeln: Vorlagen oder statische Dateien. Weitere Informationen finden Sie in den Kolbendokumenten .

Pixelistik
quelle
1
Wie können wir die Blaupausenrouten in einer anderen Datei als dem Init dieser Blaupause haben?
Divyenduz
Wenn ich mit JWT einen gesicherten Endpunkt erstellen möchte, wie wird das in jeder route.py-Datei gemacht
Ashok Sri
17

Ich möchte flask-empty bei GitHub empfehlen .

Es bietet eine einfache Möglichkeit, Blaupausen , mehrere Ansichten und Erweiterungen zu verstehen .

Jonathan Prates
quelle
17

Sie können einen einfachen Trick verwenden, bei dem die Flask-App-Variable aus main in eine andere Datei importiert wird, z.

test-routes.py

from __main__ import app

@app.route('/test', methods=['GET'])
def test():
    return 'it works!'

und in Ihren Hauptdateien, in denen Sie die Kolben-App deklariert haben, importieren Sie Testrouten wie:

app.py.

from flask import Flask, request, abort

app = Flask(__name__)

# import declared routes
import test-routes

Es funktioniert von meiner Seite.

Nimeresam
quelle
2
Es ist nur ein Beispiel, __main__bezieht sich auf Ihre Eingabedatei, das war's!
Nimeresam
3
Genial, vielen Dank. Blueprint oder der obige Paketansatz sind Overkills für kleine Apps.
VH-NZZ
Hier ist ein Link zu den Dokumenten, in denen diese Methode erklärt wird: https://flask.palletsprojects.com/de/1.1.x/patterns/packages/
Christopher
5

Die App in Blaupausen zu unterteilen, ist eine großartige Idee. Wenn dies jedoch nicht ausreicht und Sie den Blueprint selbst in mehrere Py-Dateien aufteilen möchten, können Sie dies auch mit dem regulären Python-Modul-Importsystem tun und anschließend alle Routen durchlaufen, die aus den anderen Dateien importiert werden .

Ich habe einen Gist mit dem Code dafür erstellt:

https://gist.github.com/Jaza/61f879f577bc9d06029e

Soweit mir bekannt ist, ist dies derzeit die einzig mögliche Möglichkeit, eine Blaupause aufzuteilen. Es ist nicht möglich, "Unterpläne" in Flask zu erstellen, obwohl ein Problem offen ist, über das viel diskutiert wird:

https://github.com/mitsuhiko/flask/issues/593

Selbst wenn dies möglich wäre (und es wahrscheinlich möglich ist, einige der Snippets aus diesem Issue-Thread zu verwenden), können Sub-Blueprints für Ihren Anwendungsfall ohnehin zu restriktiv sein - z. B. wenn Sie nicht alle Routen in a möchten Submodul mit demselben URL-Subpräfix.

Jaza
quelle
4

Diese Aufgabe kann ohne Blaupausen und schwierige Importe mithilfe der zentralisierten URL-Zuordnung ausgeführt werden

app.py.

import views
from flask import Flask

app = Flask(__name__)

app.add_url_rule('/', view_func=views.index)
app.add_url_rule('/other', view_func=views.other)

if __name__ == '__main__':
    app.run(debug=True, use_reloader=True)

views.py

from flask import render_template

def index():
    return render_template('index.html')

def other():
    return render_template('other.html')
Bleiz
quelle