引入Djoser路由与Swagger共存时触发类型错误
解决Djoser集成后Swagger文档报错的问题
我之前碰到过一模一样的情况,大概率是Djoser的路由和Swagger的自动文档生成逻辑冲突了,尤其是Djoser自带的部分视图没被Swagger正确识别,或者权限配置出了问题。给你几个可行的解决思路:
1. 让Swagger只扫描你的业务路由,排除Djoser
Swagger默认会遍历所有urlpatterns生成文档,Djoser的一些内部路由(比如密码重置、用户激活)可能会干扰文档生成。你可以在Swagger的配置里指定只扫描自己的API路由:
如果用的是旧版django-rest-swagger:
from rest_framework_swagger.views import get_swagger_view from django.urls import path, include # 只包含你的业务API路由,排除Djoser的路由 schema_view = get_swagger_view( title='API Documentation', patterns=[ path('api/', include('your_app.urls')), # 替换成你的业务路由 ] )
如果用的是新版的drf-yasg(更推荐的Swagger工具):
from drf_yasg.views import get_schema_view from drf_yasg import openapi from django.urls import url, include schema_view = get_schema_view( openapi.Info( title="API Documentation", default_version='v1', ), public=True, # 过滤掉Djoser的路由,只处理业务API patterns=[url(r'^api/', include('your_app.urls'))], )
2. 配置Swagger识别Djoser的视图(如果需要包含Djoser接口到文档)
如果你想把Djoser的API也放进Swagger文档,需要确保Swagger能正确识别它的视图。可以在settings.py里添加全局配置:
SWAGGER_SETTINGS = { 'SECURITY_DEFINITIONS': { 'Bearer': { 'type': 'apiKey', 'name': 'Authorization', 'in': 'header' } }, 'USE_SESSION_AUTH': False, # 禁用会话认证,适配Djoser的Token/JWT认证 'JSON_EDITOR': True, }
同时确保Djoser的路由配置正确,别搞反顺序:
# urls.py from django.urls import path, include urlpatterns = [ path('docs/', schema_view), # 正确添加Djoser的路由 path('auth/', include('djoser.urls')), path('auth/', include('djoser.urls.jwt')), # 用JWT的话加上这行 # 你的业务路由 path('api/', include('your_app.urls')), ]
3. 豁免Swagger视图的权限
有时候Swagger访问Djoser视图时会触发权限校验,导致报错。你可以给Swagger视图设置允许所有访问:
from rest_framework.permissions import AllowAny # 针对django-rest-swagger schema_view = get_swagger_view( title='API Documentation', permission_classes=[AllowAny], ) # 针对drf-yasg schema_view = get_schema_view( openapi.Info( title="API Documentation", default_version='v1', ), public=True, permission_classes=[AllowAny], )
4. 查看完整报错栈定位具体问题
你提供的报错信息不完整,建议看一下报错栈的最后一行,比如是不是某个视图没有schema属性,或者权限类抛出了异常。比如常见的是Djoser的某些视图没配置权限类,Swagger生成文档时无法解析。
内容的提问来源于stack exchange,提问作者Bo Gydza
相关产品推荐
相关产品推荐

