Django测试反向解析DRF Swagger路由报NoReverseMatch问题求助
问题解决方法
根因说明
Django的URL路由会在项目启动/测试初始化阶段一次性加载完成,你在urls.py中把SWAGGER_URLS放在了if settings.DEBUG的判断分支里,该分支逻辑仅会在URL加载时执行一次。
你使用@override_settings(DEBUG=True)仅修改了运行时的配置值,不会触发URL路由的重新加载,因此测试运行时路由表中不存在swagger命名路由,就会抛出NoReverseMatch错误。而你本地启动服务时DEBUG默认开启,URL加载阶段就已经把swagger路由加入路由表,所以浏览器可以正常访问。
可选解决方案
方案1:测试时强制重载URL配置
测试运行时修改DEBUG配置后,手动清空URL缓存并重新加载项目URL模块,示例代码如下:from django.test import TestCase, override_settings from django.urls import reverse, clear_url_caches from importlib import reload from rest_framework import status # 替换为你实际项目的urls模块 from your_project_name import urls class SwaggerTest(TestCase): @override_settings(DEBUG=True) def test_successful_swagger_pint(self): # 清空URL缓存并重载urls模块 clear_url_caches() reload(urls) response = self.client.get(reverse('swagger')) self.assertEqual(response.status_code, status.HTTP_200_OK) def tearDown(self): # 测试结束后还原URL配置,避免影响其他测试 clear_url_caches() reload(urls)方案2:修改测试环境配置
找到你的项目测试配置文件(通常为settings/test.py),直接设置DEBUG = True,这样测试初始化加载URL阶段就会自动加入swagger路由,不需要额外的动态配置修改操作。方案3:调整swagger路由位置
如果你不需要限制swagger仅在DEBUG模式下访问,可以直接把urlpatterns += SWAGGER_URLS的逻辑移到if settings.DEBUG判断之外,这样不管DEBUG取值如何,路由都会存在,测试时也能正常找到。注意如果生产环境不需要暴露swagger,不要使用该方案,避免接口信息泄露。
内容的提问来源于stack exchange,提问作者user12314098
相关产品推荐
相关产品推荐

