[Flask] Mehrere Routen auf View

Django, Flask, Bottle, WSGI, CGI…
Antworten
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Hi,

ich habe mehrere Routen auf einem View

Code: Alles auswählen

@ogr.route('/layer/')
@ogr.route('/layer/index.html')
def layer():
    pass
keine Ahnung, ob das jemals valide war, aber bei Flask < 0.7 war das bisher nie ein Problem. Heute habe ich Flask auf 0.7 aktualisiert und jetzt scheint das nicht mehr zu funktionieren.

Firefox meldet:
The page isn't redirecting properly
Firefox has detected that the server is redirecting the request for this address in a way that will never complete.
Scheinbar gibt es da Probleme beim Routing ;)

Jetzt meine Frage: Wie kann ich jetzt zwei Endpoints am elegantesten auf einen View registrieren? Zweiten View und dann einen Redirect erscheint mir etwas umständlich.

Danke,
Frank
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

0.7.1 stellt das alte Verhalten wieder her. Allerdings wird es im moment nicht empfohlen mehr als eine Regel auf dem selben view zu haben wenn die eine nicht auf die andere weiterleitet weil du damit keine eindeutigen URLs mehr hast was aber in der Regel wuenschenswert ist.

Besser:

Code: Alles auswählen

@app.route('/layer/')
@app.route('/layer/index.html', redirect_to='layer/')
def layer():
    pass
TUFKAB – the user formerly known as blackbird
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Prima, das hilft mir weiter. Der redirect_to Parameter des Route-Decorators ist aber noch nirgends dokumentiert, oder? Ich hatte extra die API Dokumentation durchgesehen und da ist mir nichts in dieser Hinsicht aufgefallen.
Allerdings wird es im moment nicht empfohlen mehr als eine Regel auf dem selben view zu haben wenn die eine nicht auf die andere weiterleitet weil du damit keine eindeutigen URLs mehr hast was aber in der Regel wuenschenswert ist.
Ich habe jetzt mal meine Anwendungen nach doppelten URLs durchgesehen und die meisten sind ähnlich wie mein Beispiel, also einmal mit xyz.html als Anhang am Pfad und einmal nur der Pfad ohne "HTML-Datei". Nur ein paar Routen sind wirklich unterschiedlich, hauptsächlich sind das Service-URLs, die kein HTML, sondern andere Daten liefern. Der Grund für die unterschiedlichen URLs sind da die Anwendungen, die auf die Resourcen zugreifen. Ein paar alte Anwendungen haben noch die alten URLs für die Resourcen, können aber vom selben View bedient werden wie die neueren Anwendungen.
Ist der Grund für eindeutige URLs ein technischer, oder ist das eher etwas konzeptionelles? Hat da jemand Links zu? Meine Recherche hat da bisher nix anständiges geliefert ...



Nachtrag: Niet

Code: Alles auswählen

@pndo.route('/')
@pndo.route('/index.html', redirect_to='/')
def index():
    return render_template('pndo/index.html')
zeigt im Firefox auch das o.g. Problemverhalten (Redirecting not properly). Mit einer Route geht's, wie gehabt ...
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

Hab grad die Releasenotes gefunden: Da hat sich ja einiges geändert mit 0.7, deshalb bin ich erst mal zurück auf 0.6, bis ich die Zeit finde, mich mit den Neuerungen auseinander zu setzen (Blueprints und so).

Ich hatte die Releasenotes gestern bereits gesucht und nicht gefunden, am Ende der Dokumentation ganz unten auf der Seite hatte ich nicht gesucht, bzw. damit gerechnet. Anstatt die .gz's auf der Hauptseite gleich zwei mal zu verlinken hätte ich einen Link auf eine spezielle Releaseseite mit dem Downloadlink besser gefunden. Oder so wie bei SQLAlchemy, da hat man direkt Zugriff auf auf Download, Changelog und What's new an prominenter Stelle.
Trotz der o.g. Kritik ein Lob an die Entwickler für die tolle Software :!:
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

mitsuhiko hat geschrieben:Allerdings wird es im moment nicht empfohlen mehr als eine Regel auf dem selben view zu haben wenn die eine nicht auf die andere weiterleitet weil du damit keine eindeutigen URLs mehr hast was aber in der Regel wuenschenswert ist.
Du meinst, es soll eindeutig sein, dass eine Anfrage auf `/layer/index.html` nur umleitet und dann das Ergebnis von `/layer/` ausgegeben wird? Ich denke, ich habe zu wenig Ahnung, um beurteilen zu können, ob das sinnvoll ist oder nicht, nur wundert es mich, wieso das "doppelte" Dekorieren dann überhaupt möglich ist. Die @-Syntax mag ja ganz praktisch sein, aber für die Umleitungen wäre doch eigentlich eine gesonderte Festlegung, welche nicht direkt an der Funktion "klebt", etwas einleuchtender, oder nicht? Hätte es nicht außerdem eine Empfehlung in der Doku statt dieser Restriktion getan? Nur meine bescheidene Meinung...

EDIT: Oder halt ein `@redirect` einführen, welches man entsprechen über `@route` setzen kann.
Antworten