如何基于drf-spectacular在Swagger-UI中实现端点搜索栏?
解决Swagger UI无法搜索端点URL的问题
方法1:修改drf-spectacular配置,给端点添加含URL的摘要/描述
在Django项目的settings.py中,配置SPECTACULAR_SETTINGS,通过自定义后置处理钩子,把端点URL注入到每个接口的摘要或描述里,让Swagger UI的默认搜索能覆盖到URL内容:
SPECTACULAR_SETTINGS = { # 保留你的其他配置项 'POSTPROCESSING_HOOKS': [ 'drf_spectacular.hooks.postprocess_schema_enums', 'your_project.utils.custom_schema_postprocessing', # 自定义钩子函数路径 ], }
然后在项目的utils.py中实现这个钩子函数:
def custom_schema_postprocessing(schema, request, public): # 遍历所有API路径 for path, path_item in schema['paths'].items(): # 遍历路径下的所有HTTP方法(GET/POST等) for method, operation in path_item.items(): # 将URL路径添加到摘要前,确保搜索能命中 original_summary = operation.get('summary', '') operation['summary'] = f"{path} - {original_summary}" # 也可以选择把URL写入描述字段 # if operation.get('description'): # operation['description'] = f"端点URL: {path}\n\n{operation['description']}" # else: # operation['description'] = f"端点URL: {path}" return schema
配置完成后,每个端点的摘要会包含URL路径,Swagger UI搜索框输入URL中的关键词就能匹配到对应接口。
方法2:自定义Swagger UI的搜索过滤逻辑
如果不想修改Schema内容,可以直接在Swagger UI的初始化配置里,自定义过滤函数,让它同时搜索端点的URL路径:
SPECTACULAR_SETTINGS = { # 保留你的其他配置项 'SWAGGER_UI_SETTINGS': { 'filter': True, # 自定义过滤函数,扩展搜索范围到URL路径 'filterFunction': """ function(filter, document) { const matchesFilter = (str) => str.toLowerCase().includes(filter.toLowerCase()); return document.paths.some((path, pathKey) => { // 先检查URL路径是否匹配 if (matchesFilter(pathKey)) return true; // 再检查接口的标签、摘要、描述 return Object.values(path).some(operation => { return (operation.tags || []).some(tag => matchesFilter(tag)) || matchesFilter(operation.summary || '') || matchesFilter(operation.description || ''); }); }); } """, }, }
这个函数会让搜索框同时匹配URL路径、标签、摘要和描述,直接满足按URL搜索端点的需求。
验证效果
配置完成后重启Django服务,打开Swagger UI页面,在搜索框输入URL中的部分文本(比如/api/users/里的users),就能找到对应的端点。
内容的提问来源于stack exchange,提问作者RPH
相关产品推荐
相关产品推荐

