想让 URL 里的 /u/
转换器定义与注册:
1 | class ListConverter(BaseConverter):
2 | regex = r"[\w-]+(?:,[\w-]+)*"
3 | def to_python(self, value): return value.split(",")
4 | def to_url(self, values): return ",".join(BaseConverter.to_url(self, v) for v in values)
5 | class UserConverter(BaseConverter):
6 | regex = r"\d+"
7 | def to_python(self, value):
8 | uid = int(value)
9 | if uid not in USERS: raise ValidationError()
10 | return {"id": uid, "name": USERS[uid]}
11 | def to_url(self, user): return str(user["id"])
12 | app.url_map.converters["list"] = ListConverter
13 | app.url_map.converters["user"] = UserConverter
GET /tags/a,b,c → 200 list:['a', 'b', 'c']
GET /tags/solo → 200 list:['solo']
GET /tags/a,,b → 404
GET /u/1 → 200 dict:{'id': 1, 'name': 'ann'}
GET /u/2 → 200 dict:{'id': 2, 'name': 'bob'}
GET /u/3 → 404
GET /u/abc → 404 上一篇:path、int、float、uuid 转换器;下一篇:路由中的尾部斜杠行为。
url_for("tags", tags=["x","y","z"]) → /tags/x,y,z
url_for("user", u={"id": 2, ...}) → /u/2
url_for("tags", tags=["a b","c"]) → /tags/a%20b,c (to_url 里调用 BaseConverter.to_url 做了 URL 转义)使用未注册的 list 转换器 → LookupError: the converter 'list' does not exist
GET /u/3 → 404;触发的回调:['before_request'] GET /v/1 → 404;触发的回调:['before_request', 'view']
自定义 user 转换器 73.5 µs/请求;内置 int 73.8 µs/请求;差 -0.3 µs