bigywater.tech
Flask · 18

path、int、float、uuid 转换器

/ 能不能匹配负数?/ 能不能匹配 1?path 为什么能带斜杠?uuid 要什么格式?这篇每个都试一遍,并看 url_for 反过来怎么生成。

7
默认注册的转换器名字个数(any、default、float、int、path、string、uuid)
404
不匹配时的状态码(int 遇到 -5、float 遇到 1 都是 404)
/ir/500
int(min=1,max=100) 传入 500 时 url_for 仍然生成的结果

内置转换器的匹配

实测 · 本机执行输出
  string:
    'abc'                                      → str:'abc'
    'a/b'                                      → 404
    ''                                         → 404
    '中文'                                       → str:'中文'
  int:
    '5'                                        → int:5
    '007'                                      → int:7
    '-5'                                       → 404
    '1.5'                                      → 404
    'abc'                                      → 404
    '99999999999999999999'                     → int:99999999999999999999
  float:
    '1.5'                                      → float:1.5
    '1'                                        → 404
    '-1.5'                                     → 404
    '.5'                                       → 404
    '1e3'                                      → 404
  path:
    'a'                                        → str:'a'
    'a/b/c'                                    → str:'a/b/c'
    '/x'                                       → 308
  uuid:
    '00000000-0000-0000-0000-000000000001'     → UUID:UUID('00000000-0000-0000-0000-000000000001')
    'not-a-uuid'                               → 404
    '12345678123456781234567812345678'         → 404
  默认(省略转换器):
    'abc'                                      → str:'abc'
    'a/b'                                      → 404

上一篇:URL Rule 与路由匹配顺序;下一篇:自定义 URL Converter。

转换器参数

实测 · 本机执行输出
  int(fixed_digits=3)             '007' → int:7 | '7' → 404 | '1234' → 404
  int(min=1,max=100)              '0' → 404 | '1' → int:1 | '100' → int:100 | '101' → 404
  int(signed=True)                '-5' → int:-5 | '5' → int:5
  string(length=3)                'abc' → str:'abc' | 'ab' → 404 | 'abcd' → 404
  string(minlength=2,maxlength=4) 'a' → 404 | 'ab' → str:'ab' | 'abcd' → str:'abcd' | 'abcde' → 404
  any(cat,dog)                    'cat' → str:'cat' | 'dog' → str:'dog' | 'fish' → 404

url_for 反向生成

实测 · 本机执行输出
    int 5            → /i/5
    int "007"        → /i/7
    float 1.5        → /f/1.5
    float 1          → /f/1.0
    path "a/b"       → /p/a/b
    string "a/b"     → /s/a/b
    string "中文 空格"   → /s/%E4%B8%AD%E6%96%87%20%E7%A9%BA%E6%A0%BC
    uuid 对象          → /u/00000000-0000-0000-0000-0000000000ff
    int "abc"        → ValueError: invalid literal for int() with base 10: 'abc'
    int 超出 max       → /ir/500

正则与权重

实测 · 本机执行输出
  UnicodeConverter  regex = '[^/]+'                                  weight = 100
  IntegerConverter  regex = '\\d+'                                   weight = 50
  FloatConverter    regex = '\\d+\\.\\d+'                            weight = 50
  PathConverter     regex = '[^/].*?'                                weight = 200
  UUIDConverter     regex = '[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}' weight = 100
  AnyConverter      regex = '[^/]+'                                  weight = 100
  默认注册的名字: ['any', 'default', 'float', 'int', 'path', 'string', 'uuid']

分步演示

URL 转换器
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动
    • 没有验证:非 ASCII 的 URL 在不同客户端编码下的匹配(见第 30 篇)、float 转换器与科学计数法的组合、转换器在蓝图 URL 前缀里的表现、Python 3.14 以外的版本里 int 对超长数字的限制
    京ICP备2026067502号-1京公网安备11010502063487号