app.route('url')中支持string,int,float,path等类型,隐形支持正则。

实现flask支持正则的步骤

1  定义正则类,继承BaseConverter

from werkzeug.routing import BaseConverter

class ReConverter(BaseConverter):

def __init__(self,url_map,*args):
super().__init__(url_map)
self.regex = args[0]

2 把正则类赋值给我们定义的正则规则

app.url_map.converters["re"] = ReConverter

3 在路由中使用正则

@app.route("/<re('\d{4}'):id>")
def index(id):
return "hello id=%s" %id

补充:

在定义转换器类时,我们通常还遇到两种方法:to_python,to_url

举例代码如下:

from flask import Flask, url_for
from werkzeug.routing import BaseConverter

app = Flask(__name__)


class ReConverter(BaseConverter):

def __init__(self,url_map,*args):
print("调用__init__")
super().__init__(url_map)
self.regex = args[0]

def to_python(self, value):
# 正则提取到的数字一般并不是就直接交给视图函数处理,而是交给to_python,进过to_python处理
print(u"调用to_python value=%s"%value)
return "4564"
def to_url(self, value):
# 反向解析先调用该函数
print(u"调用to_url value=%s"%value)
return value

app.url_map.converters["re"] = ReConverter



@app.route("/<re('\d{4}'):id>")
def index(id):
return "hello id=%s" %id

@app.route("/")
def url():
return '<a href="%s">链接</a>' % url_for('index',id="1234")


if __name__ == '__main__':
app.run(port=5003)

当我们调用to_python时,函数执行的是首先装饰器正则匹配提取出id ,然后id当成value传给to_python ,经to_python处理交给视图函数

当我们通过反向解析传递函数时,首先url_for 传递给函数to_url,to_url函数对传入value值进行处理交给装饰器,然后重复to_python步骤。