2016-08-09 7 views
12

次のコードはパスワードの更新を提供していますが、現在のパスワード確認プロセスの後にパスワードを更新するようにお願いします。だから私はそれに何を追加すべきですか?ありがとうございました。Django Rest Frameworkでユーザーパスワードを更新するには?

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 

答えて

27

私はmodelserializerを使用すると、やり過ぎかもしれないと信じています。このシンプルなシリアライザ&ビューが動作するはずです。 YiğitGü[email protected]

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


class ChangePasswordView(UpdateAPIView): 
    """ 
    An endpoint for changing password. 
    """ 
    serializer_class = ChangePasswordSerializer 
    model = UserProfile 
    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() 
      return Response("Success.", status=status.HTTP_200_OK) 

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

なぜModelSerializerが過労?このようにして、ビューの更新メソッドにシリアライゼーションコードがたくさんあります。それは良いですか? –

9

は、良い答えを与えるのおかげで、それはいくつかのマイナーなポイントで良いかもしれません。

は、限り、あなたは本当にUpdateModelMixinで動作しませんが、直接要求ユーザーインスタンスで、あなたはUpdateAPIViewを使用する必要はありません。単純なAPIViewで十分です。

また、パスワードを変更すると、ランダムコンテンツを含む200の代わりにstatus.HTTP_204_NO_CONTENTを返すことができます。

ところで、保存する前に新しいパスワードを確認するのを忘れないでください。あなたが作成していないときに "パスワード"を更新時に許可するのは残念です。

だから私は私のプロジェクトで次のコードを使用します。

from django.contrib.auth.password_validation import validate_password 

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

    def validate_new_password(self, value): 
     validate_password(value) 
     return value 

とビューのために:

class UpdatePassword(APIView): 
    """ 
    An endpoint for changing password. 
    """ 
    permission_classes = (permissions.IsAuthenticated,) 

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

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

     if serializer.is_valid(): 
      # Check old password 
      old_password = serializer.data.get("old_password") 
      if not self.object.check_password(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() 
      return Response(status=status.HTTP_204_NO_CONTENT) 

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

シリアスを使用しているのでAPIViewの代わりにGenericAPIViewを使用します。いくつかのドキュメンテーションlibはこの知識を使用します(ビューはシリアライザを使用していることを知っています)。 –

5

ユーザーを保存した後、ユーザーがログインしたままていることを確認したい場合があります(django == 1.7の後にパスワードを変更するとユーザーは自動的にログアウトされます)

from django.contrib.auth import update_session_auth_hash 

# make sure the user stays logged in 
update_session_auth_hash(request, self.object) 
関連する問題