如何在Django Rest Framework中更新用户密码? - python

我想问以下代码提供更新密码,但是我想在当前密码确认过程之后更新密码。那么我应该为此添加什么呢?谢谢。

class UserPasswordSerializer(ModelSerializer):

    class Meta:
        model = User
        fields = [
            'password'
        ]

        extra_kwargs = {
            "password": {"write_only": True},
        }

    def update(self, instance, validated_data):
        for attr, value in validated_data.items():
            if attr == 'password':
                instance.set_password(value)
            else:
                setattr(instance, attr, value)
        instance.save()
        return instance

参考方案

我相信使用Modelerializer可能会过大。这个简单的序列化器和视图应该可以工作。

Serializers.py

from rest_framework import serializers
from django.contrib.auth.models import User

class ChangePasswordSerializer(serializers.Serializer):
    model = User

    """
    Serializer for password change endpoint.
    """
    old_password = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)

Views.py

from rest_framework import status
from rest_framework import generics
from rest_framework.response import Response
from django.contrib.auth.models import User
from . import serializers
from rest_framework.permissions import IsAuthenticated   

class ChangePasswordView(UpdateAPIView):
        """
        An endpoint for changing password.
        """
        serializer_class = ChangePasswordSerializer
        model = User
        permission_classes = (IsAuthenticated,)

        def get_object(self, queryset=None):
            obj = self.request.user
            return obj

        def update(self, request, *args, **kwargs):
            self.object = self.get_object()
            serializer = self.get_serializer(data=request.data)

            if serializer.is_valid():
                # Check old password
                if not self.object.check_password(serializer.data.get("old_password")):
                    return Response({"old_password": ["Wrong password."]}, status=status.HTTP_400_BAD_REQUEST)
                # set_password also hashes the password that the user will get
                self.object.set_password(serializer.data.get("new_password"))
                self.object.save()
                response = {
                    'status': 'success',
                    'code': status.HTTP_200_OK,
                    'message': 'Password updated successfully',
                    'data': []
                }

                return Response(response)

            return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

如何在Django LDAP登录名上应用哈希SHA256? - python

我正在Django中使用LDAP身份验证,如下所示,并且还使用了密码哈希。from django_auth_ldap.config import PosixGroupType, LDAPSearch import ldap PASSWORD_HASHERS = [ 'django.contrib.auth.hashers.PBKDF2Passwor…

如何在django views.py中获取选定选项的文本值 - python

例如:如果选择了第一个选项Regular,那么我如何在views.py中获取值“ 1”及其文本值“ Regular”<form method = "post" action = "{% url 'index' %}"> {% csrf_token %} <select name =…

在烧瓶蓝图中重用代码 - python

我在flask中实现了REST API。现在我们将一组表公开为资源...所以我有2个新资源res1和res2在后端处理相应的表。我想了解如何最好地重用代码。我当时正在考虑使用常见的蓝图common_bp,因此我可以将其注册为app.register_blueprint(common_bp, url_prefix='/res1') app.…

Django-一个CBV可处理多种情况 - python

我很难理解如何使用单个CBV处理(至少)2种不同情况。这是我想做的事情:我有一个ListView来显示对象列表。从那里,我生成一个链接以导航到DetailView以显示对象的详细信息。从那里,我生成一个链接到呈现相关报告的不同视图。我想使用以下网址:1. /myapp/list.html/ 2. /myapp/detail.html/<<uuid…

Python uuid4,如何限制唯一字符的长度 - python

在Python中,我正在使用uuid4()方法创建唯一的字符集。但是我找不到将其限制为10或8个字符的方法。有什么办法吗?uuid4()ffc69c1b-9d87-4c19-8dac-c09ca857e3fc谢谢。 参考方案 尝试:x = uuid4() str(x)[:8] 输出:"ffc69c1b" Is there a way to…