Django REST Framework中JWT认证后如何获取当前用户信息?
关于Django JWT获取当前用户信息的问题解答
嘿,我来帮你梳理清楚这些问题,一步步解决👇
1. 客户端如何获取用户信息?
客户端只需要在请求你的get_current_user接口时,把登录拿到的JWT Token放在请求头里,格式是:
Authorization: Bearer <你的token内容>
后端通过JWT认证会自动识别出当前登录用户,返回对应的用户信息后,客户端就能直接展示用户名、头像、邮箱这些字段啦。
2. 你写的get_current_user方法是否正确?
思路是对的,但有个小错误需要修正:你代码里的return Response({format(data)})写法有问题,format(data)会把字典转成字符串,导致返回的不是标准JSON格式。应该直接返回Response(data)或者包装成Response({"data": data})。
不过更推荐用序列化器来处理,下面会详细说。
3. 能不能直接序列化request.user?当然可以!
手动构造data字典虽然能实现功能,但不够规范,也不利于后续扩展(比如新增字段时要手动修改字典)。用DRF的序列化器来序列化request.user是更优的方案,既简洁又能统一数据格式。
4. 有没有针对Auth-User的序列化器?
DRF没有内置的专属序列化器,但你可以轻松自己写一个ModelSerializer,适配默认的User模型(或你自定义的用户模型):
第一步:定义用户序列化器
from rest_framework import serializers from django.contrib.auth.models import User # 如果是自定义用户模型,替换成你的模型 class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ['username', 'email', 'avatar'] # 这里列出你需要返回的字段,比如头像如果是自定义字段就加上
第二步:修改你的ViewSet方法
from rest_framework.decorators import action from rest_framework.response import Response from rest_framework import viewsets # 假设你的ViewSet是继承自ViewSet或ModelViewSet class AuthViewSet(viewsets.ViewSet): @action(detail=False, methods=['get']) def get_current_user(self, request): # 直接用序列化器序列化当前用户 serializer = UserSerializer(request.user) return Response(serializer.data)
额外注意事项
- 确保你的DRF配置了JWT认证,在
settings.py里要加上:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework_simplejwt.authentication.JWTAuthentication', ], }
这样后端才能通过请求头里的Token正确识别request.user。
- 如果你的用户模型是自定义的(比如继承了
AbstractUser),只需要把序列化器里的model换成你的自定义模型,字段对应调整即可。
客户端请求示例(以Axios为例)
// 从本地存储取出登录时保存的Token const token = localStorage.getItem('user_token'); axios.get('/api/auth/get-current-user/', { headers: { 'Authorization': `Bearer ${token}` } }) .then(res => { // 拿到用户信息后渲染到页面 const user = res.data; document.querySelector('.username').textContent = user.username; document.querySelector('.user-avatar').src = user.avatar; document.querySelector('.user-email').textContent = user.email; }) .catch(err => { // 处理Token过期或认证失败的情况 console.error('获取用户信息失败:', err); });
内容的提问来源于stack exchange,提问作者Loran
相关产品推荐
相关产品推荐

