Werkzeug: Deaktivieren des angehängten Schrägstrichs zulassen?

Erstellt am 31. Jan. 2018  ·  7Kommentare  ·  Quelle: pallets/werkzeug

Wir verwenden Werkzeug und Flask, um eine REST-API zu erstellen. In diesem Zusammenhang möchten wir das automatische Anhängen von abschließenden Schrägstrichen nicht, da dies zu Asymmetrien zwischen GETs und anderen Anfragen führt und es akzeptabel ist, hier streng zu sein.

Derzeit müssen wir dazu eine benutzerdefinierte Regelklasse verwenden, die sich in Interna einklinkt ( Rule.match und RequestSlash ).

Wäre es sinnvoll, dies als Konfigurationsoption erster Ordnung hinzuzufügen? Etwas wie append_slash (um die entsprechende Django-Option zu parallelisieren) auf URL-Maps?

routing

Hilfreichster Kommentar

app.url_map.strict_slashes = False ist alles, was Sie brauchen, um dies zu vermeiden.

Alle 7 Kommentare

app.url_map.strict_slashes = False ist alles, was Sie brauchen, um dies zu vermeiden.

Das führt dazu, dass die Route tatsächlich übereinstimmt, wenn der Schrägstrich fehlt. Ich möchte 404.

Das aktuelle Verhalten ist:

| Regel hat nachgestellten Schrägstrich | Pfad hat nachgestellten Schrägstrich | strict_slashes | Ergebnis |
|-|-|-|-|
| N | N | True | (übereinstimmen) |
| N | N | False | (übereinstimmen) |
| N | Y | True | 404 |
| N | Y | False | 404 |
| Y | N | True | 301 |
| Y | N | False | (übereinstimmen) |
| Y | Y | True | (übereinstimmen) |
| Y | Y | False | (übereinstimmen) |

Ich möchte einen 404, wenn die Regel einen nachgestellten Schrägstrich hat, der Pfad jedoch nicht. Im Moment mache ich das über:

class StrictRule(Rule):
    def match(self, path, method=None):
        try:
            result = super(StrictRule, self).match(path, method)
        except RequestSlash:
            return None

        return result

Aber ich greife lieber nicht auf Interna ein.

Die Verwendung der benutzerdefinierten Regel wäre der richtige Weg, dies in Flask zu tun. Wir haben uns intern entschieden, nicht zu versuchen, alles für alle in Regeln zu schaffen. Wenn Sie eine Regel wünschen, die über das Standardangebot hinausgeht, müssen Sie diese angeben. Für Flash würden Sie url_rule_class auf die neue Klasse setzen. Weitere Informationen finden Sie in den Flask-Dokumenten. http://flask.pocoo.org/docs/1.0/api/?highlight=rule#flask.Flask.url_rule_class

@aenglander

Laut https://github.com/pallets/werkzeug/issues/1246#issuecomment -362099342 liegt das Problem hier bei der benutzerdefinierten Regelimplementierung. RequestSlash ist per https://github.com/pallets/werkzeug/blob/a220671d66755a94630a212378754bb432811158/src/werkzeug/routing.py#L259 -L260 explizit als interne Ausnahme gekennzeichnet, daher ist es ziemlich umständlich, dies in Benutzercode.

Und obwohl ich sicherlich zustimme, dass Basisregeln nicht jeden möglichen Anwendungsfall unterstützen sollten, ist die Nichtübereinstimmung bei einem fehlenden abschließenden Schrägstrich ein sehr häufiger Anwendungsfall. Für den Stand der Technik ist dieses Muster eines der wenigen, das explizit in der Django-Konfiguration über APPEND_SLASH verfügbar gemacht wird: https://docs.djangoproject.com/en/dev/ref/settings/#append -slash.

"Intern" bedeutet in diesem Fall "intern behandelt" und nicht "nur für den internen Gebrauch".

@davidism Danke für die Klarstellung. Ich werde dann weitermachen und damit weitermachen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

KangOl picture KangOl  ·  16Kommentare

SimonSapin picture SimonSapin  ·  12Kommentare

alexgurrola picture alexgurrola  ·  5Kommentare

mhelmetag picture mhelmetag  ·  8Kommentare

lepture picture lepture  ·  6Kommentare