如何将Django Rest Framework JWT接口注册到DRF DefaultRouter中
解决方案
DRF 的 DefaultRouter 的 register 方法仅支持注册继承自 ViewSet 类的视图,而 simplejwt 提供的 TokenObtainPairView、TokenRefreshView 都属于普通 APIView 子类,直接调用 register 注册会报错。
你可以通过将JWT视图封装为ViewSet的方式实现注册到router的需求,具体实现代码如下:
步骤1:封装JWT视图为ViewSet
from rest_framework import viewsets from rest_framework_simplejwt.views import ( TokenObtainPairView, TokenRefreshView, ) class TokenObtainPairViewSet(viewsets.ViewSet): def create(self, request): # 转发POST请求到原生的TokenObtainPairView return TokenObtainPairView.as_view()(request._request) class TokenRefreshViewSet(viewsets.ViewSet): def create(self, request): # 转发POST请求到原生的TokenRefreshView return TokenRefreshView.as_view()(request._request)
步骤2:注册到Router
router = DefaultRouter() # 注意两个路由前缀不要重复,避免覆盖 router.register(r'token', TokenObtainPairViewSet, basename='my_jwt_token') router.register(r'token/refresh', TokenRefreshViewSet, basename='token_refresh') urlpatterns += router.urls
效果说明
配置完成后会生成两个符合REST规范的接口:
- POST
/token/:获取access、refresh令牌 - POST
/token/refresh/:刷新access令牌
两个接口都会自动显示在DRF自带的可浏览API页面中,满足前端查看接口地址的需求。
注意事项
- 注册自定义ViewSet时必须指定
basename参数,因为这两个ViewSet没有配置queryset属性,DRF无法自动生成路由前缀标识 - 如果你只是需要让这两个接口出现在DRF可浏览API的根页面,不需要强制注册到Router,你原本直接写在
urlpatterns里的配置本身就会被DRF识别展示
内容的提问来源于stack exchange,提问作者dudulu
相关产品推荐
相关产品推荐

