use*_*042 7 python django rest django-rest-framework
我正在使用Django Rest创建一个简单的API.我需要创建一个用户可以更改他/她的密码的视图.我使用默认的Django用户模型和一个简单的UserSerializer.有方法被调用,set_password但我无法找到一种方法与用户seriliazer正确使用它.我无法在任何地方找到任何解决方案.
UserSelializer:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', "username", 'email', 'first_name', 'last_name', 'password')
Run Code Online (Sandbox Code Playgroud)
View(ClassedBased):这是一个例子(我不知道我在这做什么):
class UserChangePassword(APIView):
def patch(self, request):
user = self.request.user
serialized = UserSerializer(data=request.DATA)
if serialized.is_valid():
user.set_password(serialized.data['password'])
user.save()
return Response(status=status.HTTP_205_RESET_CONTENT)
else:
return Response(serialized.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)
请注意,我想发布一个json脚本来更改为密码.像这样的东西:
{
"old_password": "123",
"new_password": "12345"
}
Run Code Online (Sandbox Code Playgroud)
一种方法是重写序列化器中的restore_object方法。这看起来像这样:
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', "username", 'email', 'first_name', 'last_name', 'password')
# turn text to hashed password
def restore_object(self, attrs, instance=None):
attrs['password'] = make_password(attrs['password'])
return super(UserSerializer, self).restore_object(attrs, instance=None)
Run Code Online (Sandbox Code Playgroud)
现在,当它反序列化为对象实例时,您将拥有一个有效的散列密码。然后,您应该能够通过稍微修改当前的视图来完成您想要的事情。
class UserChangePassword(APIView):
def patch(self, request):
serialized = UserSerializer(data=request.DATA)
if serialized.is_valid():
serialized.save()
return Response(status=status.HTTP_205_RESET_CONTENT)
else:
return Response(serialized.errors, status=status.HTTP_400_BAD_REQUEST)
Run Code Online (Sandbox Code Playgroud)
我相信 PATCH 请求中的 JSON(取决于查找类型,我认为默认为 id)看起来像这样:
{
"id": "83",
"password": "12345"
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助!
编辑:
请注意,正如评论中指出的那样,Symmetricrestore_object在 DRF 3.0 中已被弃用
| 归档时间: |
|
| 查看次数: |
8006 次 |
| 最近记录: |