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

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请求。

这种情况下,只有两种可行场景:

  1. 用户在当前请求中提交了明文密码:比如这是一个登录相关的视图,用户刚把用户名和密码传过来,你可以直接用这些参数发送请求:
    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)
    
  2. 你提前存储了用户的明文密码:这种情况非常不推荐,因为明文密码存储会带来严重的安全风险,完全违反了密码存储的最佳实践。

关键注意事项

  • 永远不要尝试从用户对象的password字段获取明文密码,那是哈希值,无法用于api-token-auth的认证。
  • 优先使用方案一,它不仅更高效,也更符合DRF JWT的设计逻辑,避免了额外的HTTP请求和安全风险。

内容的提问来源于stack exchange,提问作者Abdul Rehman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:06:34