Nous utilisons Werkzeug et Flask pour créer une API REST. Dans ce contexte, nous ne voulons pas du comportement automatique de l'ajout de barres obliques de fin, car cela conduit à des asymétries entre les GET et les autres requêtes, et il est acceptable d'être strict ici.
Actuellement, nous devons utiliser une classe de règles personnalisée qui se connecte aux internes ( Rule.match
et RequestSlash
) pour ce faire.
Serait-il judicieux de l'ajouter en tant qu'option de configuration de premier ordre ? Quelque chose comme append_slash
(pour mettre en parallèle l'option Django équivalente) sur les mappages d'URL ?
app.url_map.strict_slashes = False
est tout ce dont vous avez besoin pour éviter cela.
Cela fait en fait correspondre la route lorsque la barre oblique est manquante. Je le veux à 404.
Le comportement actuel est :
| La règle a une barre oblique finale | Le chemin a une barre oblique finale | strict_slashes
| Résultat |
|-|-|-|-|
| N | N | True
| (correspondance) |
| N | N | False
| (correspondance) |
| N | Y | True
| 404 |
| N | Y | False
| 404 |
| Y | N | True
| 301 |
| Y | N | False
| (correspondance) |
| Y | Y | True
| (correspondance) |
| Y | Y | False
| (correspondance) |
Je veux un 404 lorsque la règle a une barre oblique à la fin mais pas le chemin. En ce moment je fais ça via :
class StrictRule(Rule):
def match(self, path, method=None):
try:
result = super(StrictRule, self).match(path, method)
except RequestSlash:
return None
return result
Mais je préfère ne pas toucher aux internes.
L'utilisation de la règle personnalisée serait la bonne façon de le faire dans Flask. Nous avons décidé en interne de ne pas essayer de tout créer pour tout le monde dans des règles. Si vous voulez une règle au-delà de ce qui est proposé en standard, vous devrez la spécifier. Pour Flash, vous devez définir le url_rule_class
sur la nouvelle classe. Consultez la documentation de Flask pour plus d'informations. http://flask.pocoo.org/docs/1.0/api/?highlight=rule#flask.Flask.url_rule_class
@anglander
Selon https://github.com/pallets/werkzeug/issues/1246#issuecomment -362099342, le problème ici concerne l'implémentation de la règle personnalisée. RequestSlash
est explicitement marqué comme une exception interne par https://github.com/pallets/werkzeug/blob/a220671d66755a94630a212378754bb432811158/src/werkzeug/routing.py#L259 -L260, il est donc assez difficile de gérer cela dans Code d'utilisateur.
Et bien que je convienne certainement que les règles de base ne devraient pas prendre en charge tous les cas d'utilisation possibles, ne pas correspondre à une barre oblique de fin absente est un cas d'utilisation très courant. Pour l'art antérieur, ce modèle est l'un des rares à être explicitement exposé dans la configuration de Django via APPEND_SLASH
: https://docs.djangoproject.com/en/dev/ref/settings/#append -slash.
"Interne" dans ce cas signifie "géré en interne", et non "pour "usage interne uniquement".
@davidism Merci pour la précision. Je vais aller de l'avant avec ça, alors.
Commentaire le plus utile
app.url_map.strict_slashes = False
est tout ce dont vous avez besoin pour éviter cela.