如何在DRF API视图函数中使用Knox生成的Token
问题根源
你当前使用的DRF原生TokenAuthentication与你采用的knox身份认证组件不兼容,前者会尝试查询rest_framework.authtoken自带的Token数据表,而你生成的Token存储在knox独立的表中,因此在鉴权阶段抛出Token 类不存在 DoesNotExist 属性的错误。
修复方案
- 替换认证类导入路径:将视图中原来的
from rest_framework.authentication import TokenAuthentication修改为from knox.auth import TokenAuthentication,使用knox自带的认证类完成鉴权。 - 确认项目配置:检查
settings.py中INSTALLED_APPS已添加knox,如果配置了全局默认认证类,需要在REST_FRAMEWORK配置项的DEFAULT_AUTHENTICATION_CLASSES中加入knox.auth.TokenAuthentication。 - 你当前Postman的Token传递格式(请求头
Authorization: Token <token值>)符合knox的默认要求,无需调整。 - 你后续补充导入的
from rest_framework.decorators import authentication_classes, permission_classes已经解决了最初的NameError问题,该部分代码无需修改。
调整后的完整视图代码参考:
from rest_framework.permissions import IsAuthenticated from rest_framework.decorators import api_view, authentication_classes, permission_classes # 从knox导入认证类,而非DRF原生 from knox.auth import TokenAuthentication @api_view(['GET']) @authentication_classes([TokenAuthentication]) @permission_classes([IsAuthenticated]) def device_list(request): devices = Device.objects.all() deviceserializer = DeviceSerializers(devices, many = True) return Response(deviceserializer.data)
内容的提问来源于stack exchange,提问作者L.Calvin
相关产品推荐
相关产品推荐

