使用django-split-settings与drf-spectacular时Swagger访问报AssertionError
解决django-split-settings与drf-spectacular整合的AssertionError问题
核心原因
这个错误本质是DRF的DEFAULT_SCHEMA_CLASS未正确设置为drf-spectacular的AutoSchema,大概率是拆分配置加载时出现遗漏或覆盖问题。
排查与修复步骤
1. 确认settings/init.py的加载顺序
确保drf.py被正确包含在配置加载列表中,且加载顺序不会让其他配置覆盖它的REST_FRAMEWORK设置。
示例__init__.py正确写法:
import os from split_settings.tools import include include( # 先加载基础配置(若有) 'components/base.py', # 加载DRF核心配置,确保优先级高于环境配置 'components/drf.py', # 环境配置放在最后,避免覆盖核心DRF设置 'environments/{}.py'.format(os.environ.get('DJANGO_ENV', 'development')), )
2. 验证drf.py的配置语法
检查drf.py中REST_FRAMEWORK的配置无语法错误:
REST_FRAMEWORK = { 'DEFAULT_SCHEMA_CLASS': 'drf_spectacular.openapi.AutoSchema', # 其他DRF配置项... }
3. 验证配置是否实际生效
在项目根目录运行Django Shell,检查当前配置值:
python manage.py shell
执行以下代码确认配置:
from django.conf import settings print(settings.REST_FRAMEWORK.get('DEFAULT_SCHEMA_CLASS'))
若输出不是drf_spectacular.openapi.AutoSchema,说明配置未加载成功,回到步骤1检查include路径和顺序。
4. 避免环境配置覆盖DRF设置
如果environments/下的配置文件(如development.py)也定义了REST_FRAMEWORK,会覆盖drf.py的设置。需用字典更新方式保留原有配置:
# environments/development.py from django.conf import settings REST_FRAMEWORK = { **settings.REST_FRAMEWORK, # 仅添加/修改当前环境专属的DRF配置 'EXCEPTION_HANDLER': 'rest_framework.views.exception_handler', }
5. 强制指定SpectacularAPIView的schema_class
若上述方法无效,可直接在urls.py中为视图指定schema_class,绕过全局配置问题:
# urls.py from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView from drf_spectacular.openapi import AutoSchema urlpatterns = [ path('api/schema/', SpectacularAPIView.as_view(schema_class=AutoSchema), name='schema'), path('api/schema/swagger-ui/', SpectacularSwaggerView.as_view(url_name='schema'), name='swagger-ui'), # 其他路由... ]
内容的提问来源于stack exchange,提问作者Ali Shamsadini
相关产品推荐
相关产品推荐

