Werkzeug: 允许禁用附加斜杠?

创建于 2018-01-31  ·  7评论  ·  资料来源: pallets/werkzeug

我们正在使用 Werkzeug 和 Flask 来构建 REST API。 在这种情况下,我们不希望附加尾部斜杠的自动行为,因为这会导致 GET 和其他请求之间的不对称,在这里严格是可以接受的。

目前我们需要使用一个自定义的规则类,它挂接到内部( Rule.matchRequestSlash )来做到这一点。

将其添加为一阶配置选项是否有意义? URL 映射上的类似append_slash (与等效的 Django 选项并行)的东西?

routing

最有用的评论

app.url_map.strict_slashes = False是您避免这种情况所需要的一切。

所有7条评论

app.url_map.strict_slashes = False是您避免这种情况所需要的一切。

当斜线丢失时,这实际上使路由匹配。 我想要 404。

目前的行为是:

| 规则尾部有斜杠 | 路径有斜杠 | strict_slashes | 结果 |
|-|-|-|-|
| 否 | 否 | True | (匹配) |
| 否 | 否 | False | (匹配) |
| 否 | 是 | True | 404 |
| 否 | 是 | False | 404 |
| 是 | 否 | True | 301 |
| 是 | 否 | False | (匹配) |
| 是 | 是 | True | (匹配) |
| 是 | 是 | False | (匹配) |

当规则有斜杠但路径没有时,我想要一个 404。 现在我正在通过以下方式执行此操作:

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

        return result

但我宁愿不深入内部。

使用自定义规则将是在 Flask 中执行此操作的正确方法。 我们在内部决定不尝试在规则中为每个人创造一切。 如果您想要超出标准提供的规则,则需要指定它。 对于 Flash,您可以将url_rule_class设置为新类。 有关更多信息,请参阅 Flask 文档。 http://flask.pocoo.org/docs/1.0/api/?highlight=rule#flask.Flask.url_rule_class

@aenglander

根据https://github.com/pallets/werkzeug/issues/1246#issuecomment -362099342,这里的问题与自定义规则实现有关。 RequestSlash被明确标记为每个https://github.com/pallets/werkzeug/blob/a220671d66755a94630a212378754bb432811158/src/werkzeug/routing.py#L259 -L260 的内部异常,所以处理这个很尴尬用户代码。

虽然我当然同意基本规则不应该支持所有可能的用例,但不匹配缺少的尾部斜杠是一个非常常见的用例。 对于现有技术,此模式是通过APPEND_SLASH在 Django 配置中显式公开的少数模式之一: https: //docs.djangoproject.com/en/dev/ref/settings/#append -slash。

在这种情况下,“内部”意味着“内部处理”,而不是“仅供内部使用”。您显示的代码很好用。

@davidism谢谢你的澄清。 那么,我会继续这样做。

此页面是否有帮助?
0 / 5 - 0 等级