Flask view auslagern?

Django, Flask, Bottle, WSGI, CGI…
Antworten
gicks
User
Beiträge: 6
Registriert: Montag 29. August 2022, 20:09

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?
Benutzeravatar
sparrow
User
Beiträge: 4187
Registriert: Freitag 17. April 2009, 10:28

Flask Views sind da nicht anders als jede andere Funktion oder Klasse auch.
Wo hast du denn Schwierigkeiten?
gicks
User
Beiträge: 6
Registriert: Montag 29. August 2022, 20:09

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.
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
gicks
User
Beiträge: 6
Registriert: Montag 29. August 2022, 20:09

Ich hätte mich vorher belesen sollen… habe jetzt verstanden das ich nicht view meinte sondern route.

Ich will route bzw wollte route auslagern.
Benutzeravatar
grubenfox
User
Beiträge: 426
Registriert: Freitag 2. Dezember 2022, 15:49

:?: 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...
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Benutzeravatar
grubenfox
User
Beiträge: 426
Registriert: Freitag 2. Dezember 2022, 15:49

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>"""

__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man kann die flask App garantiert auch irgendwo einmal Modul-global anlegen, und aus diversen Modulen importieren. Dann gehen auch die Routen dahin.
gicks
User
Beiträge: 6
Registriert: Montag 29. August 2022, 20:09

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
Benutzeravatar
grubenfox
User
Beiträge: 426
Registriert: Freitag 2. Dezember 2022, 15:49

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.
gicks
User
Beiträge: 6
Registriert: Montag 29. August 2022, 20:09

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/")
...
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten