Seite 1 von 1

Flask view auslagern?

Verfasst: Samstag 8. April 2023, 07:04
von gicks
Moin bin recht neu bei flask und finde einfach keine Möglichkeit views via import auszulagern!

Meine jetzige Anwendungen wird langsam etwas unübersichtlich 🥲

Weiß da jemand vielleicht eine Lösung?

Re: Flask view auslagern?

Verfasst: Samstag 8. April 2023, 10:26
von sparrow
Flask Views sind da nicht anders als jede andere Funktion oder Klasse auch.
Wo hast du denn Schwierigkeiten?

Re: Flask view auslagern?

Verfasst: Samstag 8. April 2023, 11:33
von gicks
Naja ich wollte als Beispiel

Code: Alles auswählen

 @app.route("/")
def home():
    return "Hello World!"
In eine separaten Datei Beispiel route.py auslagern.

Und in der main.py dann mit Import route einfügen.

Ich glaube das blueprints hier die Lösung ist… werde es heute Abend dann mal ausprobieren.
So wie beschrieben habe ich aber kein Erfolg.

Re: Flask view auslagern?

Verfasst: Samstag 8. April 2023, 11:42
von __deets__
Beschreiben ist halt so ein Ding. Es sind genug erfolgreiche Aufteilungen auf verschiedene Module beschrieben. Sagt also genau gar nix. Da musst du schon konkret zeigen, was *genau* du gemacht hast, und was *genau* die Fehlermeldungen oder unerfuellten Erwartungen sind. Sonst kann man da nur mit den Achseln zucken.

Re: Flask view auslagern?

Verfasst: Sonntag 9. April 2023, 10:22
von gicks
Ich hätte mich vorher belesen sollen… habe jetzt verstanden das ich nicht view meinte sondern route.

Ich will route bzw wollte route auslagern.

Re: Flask view auslagern?

Verfasst: Sonntag 9. April 2023, 12:02
von grubenfox
:?: route ist ein Decorator von Flask (wenn ich die Doku da richtig verstanden habe, kommt das eigentlich von Werkzeug). Interne Sachen von Flask auszulagern macht irgendwie gar keinen Sinn...

Re: Flask view auslagern?

Verfasst: Sonntag 9. April 2023, 13:02
von __deets__
Das geht (denke ich, code zu sehen bekommen wir ja nicht…) nicht um das auslagern des route-Dekorators. Sondern die Deklaration von Routen einer Anwendung anders zu gruppieren. Das geht bestimmt.

Re: Flask view auslagern?

Verfasst: Sonntag 9. April 2023, 14:17
von grubenfox
also das funktioniert jedenfalls.... (die Deklaration der Routen ist zwar immer noch in einer Datei, aber die 'ganz lange' Routine für die Beta-Welt ist ausgelagert in eine eigene Unit)

Code: Alles auswählen

# alpha_omega.py
from flask import Flask
from beta import beta_world

app = Flask(__name__)

@app.route("/")
def hello_world():
    return """<p>Hello, World!</p>
    <p>goto Planet <a href="/alpha">Alpha</a></p>
    <p>goto Planet <a href="/beta">Beta</a></p>
    <p>goto Planet <a href="/gamma">Gamma</a></p>
    <p>goto Planet <a href="/delta">Delta</a></p>
    """

@app.route("/alpha")
def alpha_world():
    return """<p>Alpha</p>
    <p>Rücksturz zur <a href="/">Heimatwelt</a>"""

@app.route("/beta")
def beta():
    return beta_world()

@app.route("/gamma")
def gamma_world():
    return """<p>GAMMA</p>
    <p>Rücksturz zur <a href="/">Heimatwelt</a>"""

@app.route("/delta")
def delta_world():
    return """<p>delta</p>
    <p>Rücksturz zur <a href="/">Heimatwelt</a>"""

Code: Alles auswählen

# beta.py
def beta_world():
    return """<p>ausgelagertes Beta</p>
    <p>Rücksturz zur <a href="/">Heimatwelt</a>"""


Re: Flask view auslagern?

Verfasst: Sonntag 9. April 2023, 14:32
von __deets__
Man kann die flask App garantiert auch irgendwo einmal Modul-global anlegen, und aus diversen Modulen importieren. Dann gehen auch die Routen dahin.

Re: Flask view auslagern?

Verfasst: Sonntag 9. April 2023, 14:48
von gicks
grubenfox hat geschrieben: Sonntag 9. April 2023, 14:17 also das funktioniert jedenfalls.... (die Deklaration der Routen ist zwar immer noch in einer Datei, aber die 'ganz lange' Routine für die Beta-Welt ist ausgelagert in eine eigene Unit)

Code: Alles auswählen

# alpha_omega.py
from flask import Flask
from beta import beta_world

app = Flask(__name__)

@app.route("/")
def hello_world():
    return """<p>Hello, World!</p>
    <p>goto Planet <a href="/alpha">Alpha</a></p>
    <p>goto Planet <a href="/beta">Beta</a></p>
    <p>goto Planet <a href="/gamma">Gamma</a></p>
    <p>goto Planet <a href="/delta">Delta</a></p>
    """

@app.route("/alpha")
def alpha_world():
    return """<p>Alpha</p>
    <p>Rücksturz zur <a href="/">Heimatwelt</a>"""

@app.route("/beta")
def beta():
    return beta_world()

@app.route("/gamma")
def gamma_world():
    return """<p>GAMMA</p>
    <p>Rücksturz zur <a href="/">Heimatwelt</a>"""

@app.route("/delta")
def delta_world():
    return """<p>delta</p>
    <p>Rücksturz zur <a href="/">Heimatwelt</a>"""

Code: Alles auswählen

# beta.py
def beta_world():
    return """<p>ausgelagertes Beta</p>
    <p>Rücksturz zur <a href="/">Heimatwelt</a>"""

Hey genau das war mein Vorhaben die Deklaration habe ich dann wie hier im Video auch noch aus der „Main.py“ bekommen.

https://youtu.be/WteIH6J9v64

Re: Flask view auslagern?

Verfasst: Sonntag 9. April 2023, 16:49
von grubenfox
ach.. "Tech with Tim" habe ich auch kürzlich für mich entdeckt. Ich bin da aber aktuell bei den Videos mit "AI" im Titel unterwegs.

Dass Blueprint auch einen route-Decorator zur Verfügung stellt war mir jetzt nicht bekannt. Daher war mein erster Versuch beim obigen Code auch schon in beta.py mit

Code: Alles auswählen

@app.route("/beta")
zu arbeiten. Dazu musste ich in beta.py das app aus dem Hauptprogramm importieren und damit dann das beta auch irgendwie im Hauptprogramm wieder bekannt war auch beta.py importieren und schon war der zirkuläre Import da und das will man nun wirklich nicht... :cry:

Wobei die Deklaration(en) der ausgelagerten Dinge bekommt man dann mit den Blueprints weg, aber dafür hat man dann die „app.register_blueprint“-Zeilen in der main.py .... irgendeine Verbindung zu den ausgelagerten Python.Dateien braucht es ja immer.

Re: Flask view auslagern?

Verfasst: Sonntag 9. April 2023, 21:00
von gicks
grubenfox hat geschrieben: Sonntag 9. April 2023, 16:49 aber dafür hat man dann die „app.register_blueprint“-Zeilen in der main.py .... irgendeine Verbindung zu den ausgelagerten Python.Dateien braucht es ja immer.
Ja korrekt aber ich hab nur eine Zeile blueprint pro XY.py

Code: Alles auswählen

app.register_blueprint(blueprintXY)
und kann dort die Routen für mehrere Unterseiten ablegen.

als Beispiel dann

Code: Alles auswählen

@blueprintXY.route("/comment/")
...

@blueprintXY.route("/posts/")
...

@blueprintXY.route("/whatever/")
...

Re: Flask view auslagern?

Verfasst: Sonntag 9. April 2023, 23:01
von __blackjack__
Zirkulären Import zwischen zwei Modulen kann man oft auch durch ein drittes Modul beseitigen. Also in diesem Fall eines wo das (globale) `app`-Objekt erstellt wird und das von den anderen beiden Modulen dann importiert wird.