demo如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from flask import Flask, jsonify

app = Flask(__name__)

@app.route('/users/kaka')
def update_user():
return jsonify(a=1)

@app.route('/users/kaka/')
def upddate_userss():
return jsonify(a=11)

@app.route('/users/kaka/aaaa')
def updaate_userss():
return jsonify(a=11)

@app.route('/users/kaka/<int:id>')
def updegate_userss(id):
return jsonify(a=11)


if __name__ == '__main__':
app.run(debug=True, port=3000)

flask的每一条url对应着一个Rule实例, 打印其_regexrule如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
##########################
from werkzeug.routing import Rule

a = Rule()
a.compile() # 这个方法会把路由编译成对应的正则, 然后等请求过来的时候进行匹配
#####################################
# [^xyz]
# 负值字符集合。匹配未包含的任意字符。例如,“[^abc]"可以匹配"plain"中的"p"。
['\\|', '\\/users\\/kaka']
re.compile('^\\|\\/users\\/kaka$')
/users/kaka
.................
['\\|', '\\/users\\/kaka']
re.compile('^\\|\\/users\\/kaka(?<!/)(?P<__suffix__>/?)$')
# (?<!pattern)
# 反向否定预查,与正向否定预查类拟,只是方向相反。
# 例如“(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",
# 但不能匹配"2000Windows"中的"Windows"。
/users/kaka/
.................
['\\|', '\\/users\\/kaka\\/aaaa']
re.compile('^\\|\\/users\\/kaka\\/aaaa$')
/users/kaka/aaaa
.................
['\\|', '\\/users\\/kaka\\/', '(?P<id>\\d+)']
re.compile('^\\|\\/users\\/kaka\\/(?P<id>\\d+)$')
/users/kaka/<int:id>
.................