Django使用Knox Token时如何在自定义函数中通过token获取用户对象
Django Knox 函数视图获取token对应用户的实现方案
完全可以在自定义函数视图中获取token对应的用户,这里提供两种常用的实现方式:
方案1:搭配DRF装饰器(推荐)
Knox 本身和 Django REST Framework 的认证体系完全兼容,你可以直接用DRF提供的函数视图装饰器复用类视图的认证逻辑,不需要自己处理token校验:
- 先在
settings.py中配置全局默认认证类(如果还没配置的话):
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': ('knox.auth.TokenAuthentication',), }
- 给你的自定义函数加上对应装饰器即可:
from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response # 参数为视图支持的请求方法,根据你的业务需求调整 @api_view(['GET', 'POST']) @permission_classes([IsAuthenticated]) def dashboard(request): # 直接通过request.user即可拿到当前token对应的用户,和类视图用法完全一致 current_user = request.user # 你的业务逻辑 return Response({ "username": current_user.username, "email": current_user.email })
前端请求时需要在请求头中携带Authorization: Token <生成的knox token>即可正常完成认证。
方案2:原生Django视图手动解析token
如果你使用的是纯原生Django函数视图,不想引入DRF的装饰器,可以手动解析请求头中的token匹配用户:
from django.utils import timezone from django.http import JsonResponse from knox.models import AuthToken def dashboard(request): # 读取请求头中的认证信息 auth_header = request.META.get('HTTP_AUTHORIZATION', '') if not auth_header.startswith('Token '): return JsonResponse({"error": "缺少认证凭证"}, status=401) # 提取token值 token_value = auth_header.split(' ')[1] # Knox仅存储token的前8位作为查询索引,直接匹配前8位即可 try: auth_token = AuthToken.objects.get(token_key=token_value[:8]) except AuthToken.DoesNotExist: return JsonResponse({"error": "无效的认证凭证"}, status=401) # 校验token是否过期 if auth_token.expiry < timezone.now(): return JsonResponse({"error": "认证凭证已过期"}, status=401) # 拿到token对应用户 current_user = auth_token.user # 你的业务逻辑 return JsonResponse({ "username": current_user.username, "email": current_user.email })
注意:方案1更推荐使用,官方已经处理了所有token校验、过期、加密匹配的安全逻辑,手动实现容易出现安全漏洞。
内容的提问来源于stack exchange,提问作者m4rtin
相关产品推荐
相关产品推荐

