django-rest-framework - django rest 中所有用户的密码正在更改
问题描述
我已经为密码更改制作了一个 API,但它正在更改所有用户的密码,而不仅仅是一个用户。
序列化器代码如下:
class ChangePasswordSerializer(serializers.ModelSerializer):
password1 = serializers.CharField(write_only=True, required=True, validators=[validate_password])
password2 = serializers.CharField(write_only=True, required=True)
old_password = serializers.CharField(write_only=True, required=True)
class Meta:
model = User
fields = ('old_password', 'password1', 'password2')
def validate(self, attrs):
if attrs['password1'] != attrs['password2']:
raise serializers.ValidationError({"password": "Password fields didn't match."})
return attrs
def validate_old_password(self, value):
user = self.context['request'].user
if not user.check_password(value):
raise serializers.ValidationError({"old_password": "Old password is not correct"})
return value
def update(self, instance, validated_data):
instance.set_password(validated_data['password1'])
instance.save()
return instance
查看代码如下:
class ChangePasswordView(generics.UpdateAPIView):
queryset = User.objects.all()
permission_classes = (IsAuthenticated,)
serializer_class = ChangePasswordSerializer
这段代码有什么问题?
解决方案
密码更改非常简单。Django 已经有一个表单来做这件事。试试下面的代码:
@api_view(['PUT'])
@permission_classes([IsAuthenticated])
def change_password(request):
form = PasswordChangeForm(request.user, request.data)
if form.is_valid():
form.save()
serializer = UserSerializer(request.user)
return Response(serializer.data)
return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
阅读此页面以获取有关如何使用 DRF 构建用户身份验证方法的更多信息:https ://kushgoyal.com/creating-a-sceure-login-api-using-drf-token-auth/
网址将采用以下格式:
url(r'change_password/', views.change_password)
推荐阅读
- vba - 在 word doc 中粘贴多个图像
- javascript - 多次调用reactjs组件
- google-apps-script - 如何使用 Stackdriver Logging API 获取日志
- javascript - 如何对以 const 和一堆 var 开头的 JavaScript 进行非混淆处理
- python - 使用 Selenium 向下滚动直到不可见元素变为可见
- python-3.x - 如何打印某个整数返回的次数之和?
- python - Python 诅咒 update_panels() 和 Panel.move() 问题
- python - 词向量的 np.average
- arrays - 删除第一列值重复的二维数组的元素(Swift)
- mysql - 如何将 QT 5.14.1 连接到 MYSQL 数据库?