Angular5+Django架构下,如何通过JWT获取后端登录用户详情及投票状态
解决方案:通过JWT获取登录用户并添加投票状态字段
我来帮你一步步解决这个问题,结合你的Angular5+Django+JWT技术栈,分两部分来实现:
1. 在Django后端通过JWT Token获取登录用户
首先要确保你的Django项目已经正确配置了JWT认证(常用的是djangorestframework-simplejwt库),只要请求头里携带了有效的JWT Token,DRF框架会自动解析Token并关联到对应的用户实例。
在视图中,你可以直接通过request.user获取当前登录用户,前提是视图配置了IsAuthenticated权限类(确保仅已登录用户能访问):
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated class UserProfileView(APIView): permission_classes = [IsAuthenticated] # 限制仅登录用户访问 def get(self, request): # 获取当前登录用户的详细信息 current_user = request.user user_details = { "id": current_user.id, "username": current_user.username, "email": current_user.email, # 其他你需要的用户字段 } return Response(user_details)
2. 添加"user_vote_status"字段判断当前用户投票状态
假设你的业务模型(比如Post)有一个多对多字段upvote存储已投票用户,要给返回的模型数据添加user_vote_status字段,推荐在序列化器中实现——这是DRF处理自定义字段最优雅的方式:
第一步:定义业务模型(如果还没定义)
from django.db import models from django.contrib.auth.models import User class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() upvote = models.ManyToManyField(User, related_name="upvoted_posts", blank=True) # 其他业务字段
第二步:创建带自定义字段的序列化器
通过SerializerMethodField动态生成user_vote_status字段,判断当前用户是否在upvote列表中:
from rest_framework import serializers from .models import Post class PostSerializer(serializers.ModelSerializer): # 自定义字段,返回当前用户的投票状态 user_vote_status = serializers.SerializerMethodField() class Meta: model = Post fields = ["id", "title", "content", "upvote", "user_vote_status"] # 包含需要返回的字段 def get_user_vote_status(self, obj): # 从序列化器的context中获取request,进而拿到当前用户 user = self.context["request"].user # 注意判断用户是否已认证,避免匿名用户报错 if user.is_authenticated: # 检查用户是否在当前Post的upvote列表中 return user in obj.upvote.all() return False # 匿名用户默认返回未投票
第三步:在视图中传递request到序列化器
序列化器需要通过context获取request,所以在视图中要把request传入序列化器的context:
from rest_framework import generics from .models import Post from .serializers import PostSerializer from rest_framework.permissions import IsAuthenticatedOrReadOnly class PostListAPIView(generics.ListAPIView): # 用prefetch_related优化查询,避免N+1数据库查询问题 queryset = Post.objects.all().prefetch_related("upvote") serializer_class = PostSerializer permission_classes = [IsAuthenticatedOrReadOnly] # 允许匿名用户查看,仅登录用户可操作 def get_serializer_context(self): # 将request添加到序列化器的context中 context = super().get_serializer_context() context["request"] = self.request return context
测试验证
当你的Angular前端携带有效的JWT Token请求这个接口时,返回的每个Post数据都会包含user_vote_status字段,值为true或false,完美实现你需要的投票状态判断。
内容的提问来源于stack exchange,提问作者Rogin Thomas
相关产品推荐
相关产品推荐

