【问题标题】:replacing token with a value用值替换令牌
【发布时间】:2021-11-19 06:49:29
【问题描述】:

我正在尝试通过检查令牌是否有效来替换令牌,然后使用该令牌取出详细信息。

例如: {"jwt":"asdahasjkaiubdkjsdjasdajkdjakdon","hostel":"BCJ bhawan","room_no":"300"......}

我会收到这样的东西

如何用 serializer1 中的值替换该标记部分

但我无法将它们合并在一起

这是我的意见.py

class leaveview(APIView):
    def post(self,request):
        token = request.data['jwt']
        if not token:
            raise AuthenticationFailed('Unauthenticated')
        
        try:
            payload = jwt.decode(token,'secret',algorithms=['HS256'])
        except jwt.ExpiredSignatureError:
            raise AuthenticationFailed('Unauthenticated')
        
        user=User.objects.filter(id=payload['id']).first()
        serializer1=UserSerializers(user)


        serializer2 = leaveSerializers(data=request.data)
        serializer2.is_valid(raise_exception=True)
        serializer=serializer1+serializer2
        serializer.save()
        return Response(serializer.data)


models.py

class leave(models.Model):
    name=models.CharField(max_length=100)
    father_name=models.CharField(max_length=100,null=True)
    
    
    branch=models.CharField(max_length=40,null=True)
    coer_id=models.CharField(max_length=12,unique=True,null=True)
    
    hostel = models.ForeignKey(hostel_manager,on_delete=models.CASCADE)
    room_no = models.CharField(max_length=10)
    where_to = models.CharField(max_length=100)
    reason = models.CharField(max_length=300)
    start_date = models.CharField(max_length = 100,null=True)
    end_date = models.CharField(max_length=100,null=True)
    phone_regex=RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+9999999999'. Up to 12 digits allowed.")
    phone_number = models.CharField(validators=[phone_regex], max_length=17)

serializer.py

class leaveSerializers(serializers.ModelSerializer):
    class Meta:
        model = leave
        fields = ['id','hostel','room_no','where_to','reason','time_period','phone_number','name','father_name','branch','coer_id']

【问题讨论】:

  • 请帮我解决这个问题

标签: python-3.x django django-models serialization django-rest-framework


【解决方案1】:

首先,你的问题有两个问题。

  • 首先你想用一个值替换一个标记。
  • 其次,您希望将序列化程序合并在一起。

在查看您的代码时,我们假设您使用的是 DRF 的 jwt 身份验证系统。

因此,您可以简单地使用以下内容来检索用户并确保用户已通过身份验证:

from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
...

class leaveview(APIView):
    @permission_classes([IsAuthenticated])
    def post(self,request):
        ...
        user = request.user
        ...

然后让 DRF 轻松处理 jwt 身份验证。

对于您的合并问题,以这种方式强制将不同性质的事物合并不是一个正确的想法。

你必须序列化你的数据:

...
serializer1 = UserSerializers(user)
serializer1_data = UserSerializers(user).data
...
serializer2.is_valid(raise_exception=True)
merged_data = {**serializer1_data, **serializer2.data}
return Response(data=merged_data)

上面应该是一个工作示例,球在您身边以简化您的代码。

【讨论】:

  • merged_data.save() 它给出了错误,因为 dict 没有属性 save 我该如何解决,感谢回答
  • 我更新了我的答案,所以你可以使用它。
  • 只是一个建议:我建议你阅读 django rest 框架文档。
  • 好的,我会的,非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-29
  • 2012-04-10
  • 2019-02-25
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多