我们正在使用 Werkzeug 和 Flask 来构建 REST API。 在这种情况下,我们不希望附加尾部斜杠的自动行为,因为这会导致 GET 和其他请求之间的不对称,在这里严格是可以接受的。
目前我们需要使用一个自定义的规则类,它挂接到内部( Rule.match
和RequestSlash
)来做到这一点。
将其添加为一阶配置选项是否有意义? URL 映射上的类似append_slash
(与等效的 Django 选项并行)的东西?
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谢谢你的澄清。 那么,我会继续这样做。
最有用的评论
app.url_map.strict_slashes = False
是您避免这种情况所需要的一切。