如何在drf_spectacular SERVERS配置中排除DRF路由/api前缀
drf-spectacular 全局API前缀处理最佳实践
不需要修改项目原有路由规则,也不需要手写脆弱的字符串截断预处理钩子,drf-spectacular 原生提供了专门的配置项实现「公共前缀放到OpenAPI servers 字段、端点路径不重复展示前缀」的需求,完全符合OpenAPI规范。
标准配置实现
直接修改项目的SPECTACULAR_SETTINGS配置即可:
SPECTACULAR_SETTINGS = { # OpenAPI服务根地址配置,后续新增多环境、多版本服务直接追加到列表即可 'SERVERS': [ {'url': 'https://example.com/api', 'description': '当前迭代生产环境'}, # 后续可直接扩展多服务地址,例如: # {'url': 'https://api.example.com/v1', 'description': 'v1正式版本'}, # {'url': 'http://127.0.0.1:8000/api', 'description': '本地开发环境'}, ], # 声明需要统一裁剪的全局路由公共前缀 'SCHEMA_PATH_PREFIX': r'/api', # 开启前缀自动裁剪:将所有端点路径中匹配到的公共前缀移除,请求时自动拼接在SERVERS地址之后 'SCHEMA_PATH_PREFIX_TRIM': True, # 保留原有其他配置项... }
之前配置出现路径重复的原因
仅配置SERVERS参数时,drf-spectacular 会默认将从Django路由表中读取到的全量路径(自带/api前缀)直接拼接到配置的server地址后,最终就会出现https://example.com/api/api/assets/这类重复路径,同时端点列表也会保留冗余的/api前缀。
原生配置方案的优势
对比手写预处理钩子的实现,原生方案不存在脆弱的硬编码截断逻辑:
- 支持正则匹配前缀,后续如果公共前缀调整为
/api/v1这类带版本的格式,仅需修改SCHEMA_PATH_PREFIX的正则规则即可,无需额外维护钩子代码 - 自动适配Swagger UI、Redoc等所有内置文档UI的路径拼接逻辑,接口测试请求不会出现地址错误
- 生成的OpenAPI schema完全符合规范:公共根路径统一在servers字段声明,每个端点仅保留自身相对路径,展示整洁无冗余
- 不会误截断非API路由的路径,配合路径排除规则可以精准控制schema生成范围
内容的提问来源于stack exchange,提问作者gmcc051
相关产品推荐
相关产品推荐

