Flask的route装饰器用<type:name>语法提取路径参数,如<int:user_id>将URL中的数字转为整数传入视图函数,但不校验正负或范围,需手动检查;常见转换器有string、path、uuid,自定义需继承BaseConverter并注册。

Flask里route装饰器怎么提取路径参数
Flask默认用<type:name>语法从URL路径中提取变量,比如/user/<int:user_id>会把123转成整数并传给视图函数。它不是正则匹配,而是预定义转换器的快捷写法。
常见错误是以为<int:user_id>能过滤负数或零——其实不会,int转换器只拒绝非数字字符串,/user/-42照样过,进函数后得你自己校验。
-
string(默认):不转义斜杠,/path/<string:subpath>能匹配/path/a/b/c -
path:和string类似,但明确允许斜杠,语义更清晰 -
uuid:要求格式严格符合UUID标准,失败直接404,不用手动try/except - 自定义转换器需继承
BaseConverter,注册到app.url_map.converters,不能只靠正则
Django的path和re_path区别在哪
path用的是Django自己的转换器(如<int:pk>),不支持正则元字符;re_path才是真正则,但捕获组必须命名,比如r'^article/(?P<year>\d{4})/$'。
容易踩的坑:混用path和re_path时,如果path规则写在前面且能匹配,后面的re_path根本没机会执行——URL分发是顺序匹配的。
立即学习“Python免费学习笔记(深入)”;
-
path性能略高,语法简洁,适合常规ID、slug等场景 -
re_path灵活,但正则写错容易导致404或意外匹配,调试困难 -
converter类里的to_python方法抛异常会变成404,不是500 - 别在
path里写<str:query>——str不是合法转换器名,要用str就换re_path
FastAPI的Path参数校验为什么总报422
FastAPI把路径参数当Pydantic字段处理,Path(...)表示必填,Path(default=None)才可选。422错误通常是因为类型声明和实际值不兼容,比如声明了int却传了abc,或者用了Path(gt=0)但传了-1。
注意:路径参数无法设为Optional[int]并留空——URL里没有“空路径段”的概念,/item//detail这种写法本身非法,服务器通常先404或400拦截掉。
- 校验失败时返回JSON错误体,含
loc字段指出是哪个路径参数出问题 -
Path(regex=r'^[a-z]+$')可用,但正则只作用于字符串原始值,不自动转类型 - 多个
Path参数按URL顺序绑定,和函数参数名一致即可,不依赖位置 - 别在
Path里用default=...试图绕过必填——它只是fallback,不改变路径结构要求
自己写正则解析路径时re.match和re.search怎么选
手动解析URL路径(比如写中间件或轻量路由)必须用re.match,因为路径匹配是从开头严格的,re.search可能误匹配子串。例如/api/v1/users被re.search(r'users', ...)命中,但显然不该算路由成功。
更大的坑是忽略URL编码:浏览器发来的%20或+>不会自动解码,正则得处理原始字节流或提前urllib.parse.unquote,否则re.match(r'/user/(\d+)', path)对/user/123%20就失效。
-
re.match(r'^/user/(?P<id>\d+)$', path)比^/user/(\d+)更安全,防止/user/123/extra被误认 - 正则里用
(?P<name>...)命名组,后续.groupdict()直接得字典,比.groups()少出错 - Python 3.11+支持
re.Match的capturesdict(),但兼容性差,别依赖 - 路径末尾斜杠是否可选?正则得显式写
/?$,别指望os.path.join那种逻辑
路径参数解析真正的复杂点不在语法,而在边界:编码、大小写、斜杠一致性、多级嵌套时的贪婪匹配。这些地方没日志很难定位,建议在路由层加个print(repr(request.path))先看原始输入。











