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?
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.
Hilfreichster Kommentar
app.url_map.strict_slashes = False
ist alles, was Sie brauchen, um dies zu vermeiden.