如何在Python中获取Django项目的全部API URL(含路由注册URL)
获取Django项目中所有完整API路径的方法
下面提供两种实用方案,帮你提取项目中所有API的完整路径——包括直接在urlpatterns里定义的,以及通过rest_framework_extensions路由器注册的路径,同时自动替换路径中的占位符(如pk)为示例值。
方法一:通过Django Shell手动查询
- 启动Django shell:
python manage.py shell
- 导入模块并遍历URL:
from django.urls import get_resolver, reverse resolver = get_resolver() full_urls = [] for pattern in resolver.url_patterns: if pattern.name: try: # 带pk参数的URL传入示例值1 if '<pk>' in pattern.pattern.regex.pattern: url = reverse(pattern.name, kwargs={'pk': 1}) else: url = reverse(pattern.name) full_urls.append(url) except: # 无法反向解析时手动处理路径 path = pattern.pattern.regex.pattern.replace('^', '').replace('$', '') path = path.replace('(?P<pk>\\d+)', '1') full_urls.append(path) # 打印结果 for url in full_urls: print(url)
方法二:编写脚本自动生成完整路径
如果需要批量处理或集成到项目流程中,可以写一个专用函数,同时兼容路由器注册的URL:
from django.urls import get_resolver, reverse # 导入你的路由器实例 from your_project.urls import router_something def get_all_full_api_urls(): full_urls = [] resolver = get_resolver() # 处理urlpatterns中的路径 for pattern in resolver.url_patterns: if pattern.name: try: if '<pk>' in pattern.pattern.regex.pattern: url = reverse(pattern.name, kwargs={'pk': 1}) else: url = reverse(pattern.name) full_urls.append(url) except: path = pattern.pattern.regex.pattern.replace('^', '').replace('$', '') path = path.replace('(?P<pk>\\d+)', '1') full_urls.append(path) # 处理路由器注册的路径 for route in router_something.urls: path = route.pattern.regex.pattern.replace('^', '').replace('$', '') path = path.replace('(?P<pk>\\d+)', '1') full_urls.append(f"something/{path}") return full_urls # 调用并打印所有完整路径 if __name__ == "__main__": urls = get_all_full_api_urls() for idx, url in enumerate(urls, 1): print(f"{idx}. {url}")
扩展说明
- 若路径中有其他占位符(如
slug),可添加替换规则,比如path = path.replace('(?P<slug>[^/]+)', 'example-slug') - 脚本执行前需确保加载Django环境,可通过
python manage.py runscript your_script_name(需安装django-extensions)或在项目根目录直接运行脚本。
内容的提问来源于stack exchange,提问作者Abinash Biswal
相关产品推荐
相关产品推荐

