如何使用drf-yasg生成第三方Django应用的Swagger接口端点
问题
是否有方法可以使用drf-yasg生成所有第三方Django应用的接口端点?
已安装social_django应用,需要将其提供的所有URL纳入Swagger UI展示,包括/login/facebook/、/login/google-oauth2/等第三方登录路径,以及Django自带的/admin/等内置路径。
当前Swagger UI仅能展示自定义开发的接口,无法识别上述第三方应用及Django内置路由对应的端点。
现有urlpatterns配置
urlpatterns = [ re_path('admin/', admin.site.urls), re_path('', include('user.urls')), re_path(r'^$', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), re_path(r'', include('social_django.urls', namespace='social')), re_path(r'accounts/', include('django.contrib.auth.urls')), ]
现有Schema配置
schema_view = get_schema_view( openapi.Info( title="Snippets API", default_version='v1', description="Test description", terms_of_service="https://www.google.com/policies/terms/", contact=openapi.Contact(email="contact@snippets.local"), license=openapi.License(name="BSD License"), ), public=True, permission_classes=(permissions.AllowAny,), )
效果参考

解决方法
drf-yasg默认只会自动扫描识别基于Django REST Framework规范实现的接口(继承自APIView、ViewSet的视图),social_django、Django内置auth、admin模块的视图都是普通Django视图,不满足DRF视图规范,所以不会被自动收录到OpenAPI文档中,可按以下方式处理:
- 手动给需要展示的非DRF视图添加swagger声明
使用swagger_auto_schema装饰器给第三方视图、内置视图补充接口描述、参数、响应等元信息,示例:from drf_yasg.utils import swagger_auto_schema from social_django.views import auth, complete # 第三方登录跳转入口 social_auth = swagger_auto_schema( method='get', operation_description='第三方登录跳转入口,适配facebook、google-oauth2等登录渠道', tags=['第三方登录'] )(auth) # 第三方登录授权回调 social_complete = swagger_auto_schema( method='get', operation_description='第三方平台授权完成后的回调接口', tags=['第三方登录'] )(complete) - 调整路由引用,不要直接全量include第三方路由
原配置中直接include('social_django.urls')的方式会让drf-yasg无法识别视图对应的元信息,可以手动声明需要展示的路由,替换原有全量引入的配置。 - 明确指定schema扫描的路由范围
在get_schema_view中传入patterns参数,指定所有需要纳入扫描的路由列表,避免漏扫:schema_view = get_schema_view( openapi.Info( title="Snippets API", default_version='v1', description="Test description", terms_of_service="https://www.google.com/policies/terms/", contact=openapi.Contact(email="contact@snippets.local"), license=openapi.License(name="BSD License"), ), public=True, permission_classes=(permissions.AllowAny,), patterns=urlpatterns ) - 特殊路由特殊处理
admin这类返回HTML页面、非API属性的路由不建议加入Swagger文档,Swagger本身定位是API调试工具,这类页面路由加入后无法正常调试,没有实际价值。如果确实需要展示入口,可以手动往生成的schema中追加路径记录,不需要走自动扫描逻辑。
内容的提问来源于stack exchange,提问作者ubqm
相关产品推荐
相关产品推荐

