You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:51:19