在Flask中,内置转换器允许通过<>
语法从URL中提取参数。标准格式为<converter:variable_name>
。内置转换器包括string
(接受不带斜杠的文本)、int
(接受正整数)、float
(接受正浮点值)、path
(与string
类似但接受斜杠)和uuid
(接受UUID字符串)。自定义转换器可以通过继承BaseConverter
类并添加到应用的转换器字典中实现,如示例中通过正则表达式定义电话号码匹配规则。
在Flask中,前文说了内置转换器:使用<>
提取参数。例如在<int: id>
中,int
就是一个转换器。
标准语法格式就是: <converter:variable_name>
path
与string
的最大区别就是带不带斜杠的问题。
转换器 | 内容 |
---|---|
string | (默认)接受任何不带斜杠的文本 |
int | 接受正整数 |
float | 接受正浮点值 |
path | 与 string 类似,但还接受斜杠 |
uuid | 接受 UUID 字符串 |
Flask框架中的转换器的自定义,具体流程如下:
导入转换器基类:在 Flask 中,所有的路由的匹配规则都是使用转换器对象进行记录;
from werkzeug.routing import BaseConverter
自定义转换器:自定义类继承于转换器基类;
class RegexConverter(BaseConverter)
添加转换器到默认的转换器字典中;
app.url_map.converters['re'] = RegexConverter
使用自定义转换器实现自定义匹配规则
@app.route('/<re(r"1\d{10}"):id>')
例如使用正则表达式1\d{10}
,表示1开头,后面跟十位数,其实就是一个11位的电话号码。
from flask import Flask
from werkzeug.routing import BaseConverter
app = Flask(__name__)
# 转换器基类
class RegexConverter(BaseConverter):
def __init__(self, url_map, regex):
super(RegexConverter, self).__init__(url_map)
self.regex = regex
def to_python(self, value):
return value
# 将自定义的转换器添加到flask应用中
app.url_map.converters['re'] = RegexConverter
@app.route('/<re(r"1\d{10}"):id>')
def hello(id):
return id
if __name__ == "__main__":
app.run()
http://127.0.0.1:5000/11234567890