Django 1.10+DRF:如何在视图中传递用户信息请求JWT Token
解决在Django视图中生成JWT令牌的问题
首先得纠正一个思路:其实你完全不需要通过HTTP请求调用api-token-auth/接口来生成令牌——DRF JWT已经提供了直接生成令牌的工具函数,直接在视图里调用会更高效,也避免了不必要的HTTP请求开销。
方案一:直接在视图中生成JWT令牌(推荐)
如果你的视图是已认证用户的视图(比如用户已经通过session认证,或者视图继承了LoginRequiredMixin/IsAuthenticated权限类),可以直接使用JWT的核心函数生成令牌,不需要再绕一圈调用API接口:
from rest_framework_jwt.settings import api_settings from rest_framework.permissions import IsAuthenticated from rest_framework import status, Response class YourViewClass(APIView): permission_classes = [IsAuthenticated] # 确保用户已认证 def post(self, request): # 获取当前已认证的用户 user = request.user # 调用JWT内置函数生成令牌 jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER payload = jwt_payload_handler(user) token = jwt_encode_handler(payload) # 返回生成的令牌 return Response({'token': token}, status=status.HTTP_200_OK)
这个方法和api-token-auth接口的逻辑完全一致,而且不需要传递用户名和密码——因为当前用户已经被认证,我们可以直接从request.user获取合法的用户对象。
方案二:必须调用api-token-auth接口的情况(仅特殊场景用)
如果你因为某些特殊需求,一定要通过HTTP请求调用api-token-auth/接口,那你需要注意一个关键问题:Django默认不会存储用户的明文密码,用户的密码是以哈希形式存在数据库的auth_user表的password字段里的。所以如果当前用户已经登录,你无法直接从用户对象中获取明文密码来发送POST请求。
这种情况下,只有两种可行场景:
- 用户在当前请求中提交了明文密码:比如这是一个登录相关的视图,用户刚把用户名和密码传过来,你可以直接用这些参数发送请求:
import requests from django.conf import settings from rest_framework import status, Response class YourViewClass(APIView): def post(self, request): # 从请求体中获取用户提交的明文用户名和密码 username = request.data.get('username') password = request.data.get('password') # 发送POST请求到api-token-auth接口 api_url = f"{settings.SITE_URL}/api-token-auth/" response = requests.post(api_url, data={'username': username, 'password': password}) if response.status_code == 200: token = response.json().get('token') return Response({'token': token}, status=status.HTTP_200_OK) else: return Response(response.json(), status=response.status_code) - 你提前存储了用户的明文密码:这种情况非常不推荐,因为明文密码存储会带来严重的安全风险,完全违反了密码存储的最佳实践。
关键注意事项
- 永远不要尝试从用户对象的
password字段获取明文密码,那是哈希值,无法用于api-token-auth的认证。 - 优先使用方案一,它不仅更高效,也更符合DRF JWT的设计逻辑,避免了额外的HTTP请求和安全风险。
内容的提问来源于stack exchange,提问作者Abdul Rehman
相关产品推荐
相关产品推荐

