Werkzeug: Autoriser la désactivation de l'ajout de barre oblique ?

Créé le 31 janv. 2018  ·  7Commentaires  ·  Source: pallets/werkzeug

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 ?

routing

Commentaire le plus utile

app.url_map.strict_slashes = False est tout ce dont vous avez besoin pour éviter cela.

Tous les 7 commentaires

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.

Cette page vous a été utile?
0 / 5 - 0 notes