bigywater.tech
Flask · 27

Blueprint 的 URL 前缀

url_prefix 写在哪里?和路由的斜杠怎么拼?嵌套时怎么叠加?这篇把各种组合的最终 URL 与访问结果都打印出来。

/b/x
Blueprint 定义 /a、注册时给 /b,最终规则
308 / 200
路由 "/" 时 /api 与 /api/ 的状态码
200 / 404
路由 "" 时 /api 与 /api/ 的状态码

定义时与注册时的前缀

实测 · 本机执行输出
  Blueprint(url_prefix="/a")                 → ['/a/x']
  register_blueprint(url_prefix="/b")        → ['/b/x']
  两处都写:Blueprint /a + register /b            → ['/b/x']
  都不写                                        → ['/x']

上一篇:Blueprint 路由注册;下一篇:Blueprint 的静态文件和模板目录。

斜杠的拼接

实测 · 本机执行输出
  前缀 /api + 路由 /                     → ['/api/']
  前缀 /api + 路由 ""(空串)                → ['/api']
  前缀 /api/ + 路由 /x                   → ['/api/x']
  前缀 /api + 路由 x(无前导斜杠)              → ['/api/x']
  前缀 api(无前导斜杠)+ 路由 /x               → ValueError: URL rule 'api/x' must start with a slash.

访问行为

实测 · 本机执行输出
  路由 "/" : {'/api': 308, '/api/': 200}
  路由 "" : {'/api': 200, '/api/': 404}

嵌套蓝图

实测 · 本机执行输出
  v1 + users: ['/v1/users/<int:i>']
  父蓝图注册时改成 /v2、子蓝图注册时改成 /people: ['/v2/people/<int:i>']

多前缀注册

实测 · 本机执行输出
  url_for('multi.ping') → /v1/ping | url_for('multi2.ping') → /v2/ping

前缀重叠

实测 · 本机执行输出
  规则: ['/a/b/c', '/a/b/c'] | GET /a/b/c → one (两个蓝图声明了同一个最终 URL,先注册的赢)

分步演示

url_prefix
本步的对象

    本文用到的工具与边界

    • 本机 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,数字每次运行会有小幅抖动
    • 没有验证:subdomain 参数与前缀的组合、url_prefix 为空串与 None 的区别、第三方扩展注册蓝图时的前缀约定
    京ICP备2026067502号-1京公网安备11010502063487号