Django中JSONWebTokenAuthentication对Skill视图无效,求认证及类视图改造方案
解决Skill API的JWT认证问题 & 函数视图转类视图
嘿,作为Django新手,别担心,这两个问题其实不难搞定,咱们一步步来:
第一步:把Skill的函数视图改成类视图
Django REST Framework提供了很多通用类视图,能帮我们少写大量重复代码,比如ListAPIView用来返回列表数据,RetrieveAPIView用来返回单个详情数据,正好对应你现在的两个函数视图。
修改你的视图文件,替换原来的两个函数:
from rest_framework.permissions import IsAuthenticated from rest_framework.authentication import JSONWebTokenAuthentication from rest_framework.generics import ListAPIView, RetrieveAPIView from .models import Skill # 确保你导入了Skill模型 from .serializers import SkillSerializer # 确保导入了对应的序列化器 class SkillList(ListAPIView): # 指定要查询的数据集 queryset = Skill.objects.all() # 指定序列化器 serializer_class = SkillSerializer # 添加JWT认证规则 authentication_classes = [JSONWebTokenAuthentication] # 要求用户必须认证才能访问 permission_classes = [IsAuthenticated] class SkillDetail(RetrieveAPIView): queryset = Skill.objects.all() serializer_class = SkillSerializer authentication_classes = [JSONWebTokenAuthentication] permission_classes = [IsAuthenticated]
第二步:更新URL配置
把原来指向函数视图的URL改成指向新的类视图,记得用.as_view()方法将类视图转换为可调用的视图函数:
# 先导入你的新类视图 from wantedly_app_views import SkillList, SkillDetail urlpatterns = [ path('admin/', admin.site.urls), url(r'^rest-auth/', include('rest_auth.urls')), url(r'^rest-auth/registration/', include('rest_auth.registration.urls')), url(r'^rest-auth/login/', include('rest_auth.registration.urls')), url(r'^refresh-token/', refresh_jwt_token), url(r'^user/$', DetailsView.as_view(), name='rest_user_details'), url(r'^', include('api.urls')), # 替换原来的Skill URL配置 url(r'^api/v1/skills/$', SkillList.as_view(), name='skill-list'), url(r'^api/v1/skills/(?P<pk>[0-9]+)$', SkillDetail.as_view(), name='skill-detail') ]
关键细节说明
- 类视图的优势:通用类视图已经帮我们封装了
GET请求的逻辑,不用再手动写if request.method == 'GET'这类重复代码,代码更简洁易维护。 - 认证与权限生效逻辑:通过
authentication_classes指定用JSONWebTokenAuthentication验证请求中的JWT Token,permission_classes设置IsAuthenticated后,只有携带有效Token的请求才能访问这些Skill接口,未认证的请求会直接返回401 Unauthorized状态码。 - 全局配置简化操作:如果你希望大部分接口都默认使用JWT认证,可以在
settings.py里添加全局配置,这样就不用每个类视图都重复写authentication_classes了:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ] }
如果有个别接口不需要认证,再单独在类视图里设置permission_classes = [AllowAny]即可。
这样改完之后,你的Skill API就会要求携带有效的JWT Token才能访问,同时也把函数视图改成了更规范的类视图,符合DRF的最佳实践~
内容的提问来源于stack exchange,提问作者Divyanshu Jimmy
相关产品推荐
相关产品推荐

