在 Flask 中,路由装饰器默认不支持正则表达式直接用于 URL 匹配。不过,Flask 提供了一种方式来捕获具有特定格式的 URL 参数。通过在路由中指定一个转换器,你可以捕获满足该格式的 URL 部分。Flask 内置了几个转换器,例如 `int`, `float`, 和 `path`。
如果你需要进行更复杂的 URL 匹配,可以使用变量规则中的 `path` 转换器,它可以匹配一个路径,包括斜线。但是,这仍然不是完整的正则表达式匹配。
为了使用正则表达式直接匹配路由,需要创建一个自定义的转换器。以下是一个如何在 Flask 中定义和使用自定义转换器以支持正则表达式匹配的步骤:
1. **定义自定义转换器**:
首先,你需要继承 `werkzeug.routing.BaseConverter` 类来创建你自己的转换器:
```python
from werkzeug.routing import BaseConverter
class RegexConverter(BaseConverter):
def __init__(self, url_map, *items):
super(RegexConverter, self).__init__(url_map)
self.regex = items[0]
```
2. **向 Flask 应用添加转换器**:
接下来,在你的 Flask 应用中添加这个转换器:
```python
app.url_map.converters['regex'] = RegexConverter
```
3. **使用自定义转换器**:
现在你可以使用 `regex` 转换器在路由中使用正则表达式了:
```python
@app.route('/<regex("[a-z]{3}"):three_letter_string>')
def three_letters(three_letter_string):
return f'Matched string: {three_letter_string}'
```
在这个例子中,路由 `/abc` 或 `/xyz` 会匹配到 `three_letters` 视图函数,因为它们符合正则表达式 `[a-z]{3}`,即三个小写字母。
通过这种方式,你可以利用正则表达式的强大功能来进行复杂的 URL 匹配,从而扩展 Flask 路由系统的灵活性。