【问题标题】:Django Rest Framework not hashing my passwordDjango Rest Framework 没有对我的密码进行哈希处理
【发布时间】:2019-03-18 06:04:25
【问题描述】:

我正在尝试在我使用 Django Rest Framework 构建的 Blog-API 中注册一个用户。这是我的代码(serializers.py):

from django.contrib.auth import get_user_model
from django.contrib.auth.hashers import make_password
from rest_framework.serializers import (ModelSerializer,
                                        HyperlinkedIdentityField,
                                        SerializerMethodField)

User = get_user_model()  


class UserCreateSerializer(ModelSerializer):
   class Meta:
       model = User
       fields = [
        'username',
        'email',
        'password',
       ]
    extra_kwargs = {
        'password': {'write_only': True}
    }

    def create(self, validated_data):
        username = validated_data['username']
        email = validated_data['email']
        password = validated_data['password']
        user_obj = User(username=username,
                        email=email)
        user_obj.set_password(password)
        user_obj.save()
        return validated_data

在 Django 管理员中,用户将按预期显示。但是,据说密码格式无效。 有人可以指出我的解决方案吗?

【问题讨论】:

    标签: django api django-rest-framework


    【解决方案1】:

    我发现了我的错误。 create() 方法的愚蠢缩进问题。

    from django.contrib.auth import get_user_model
    from django.contrib.auth.hashers import make_password
    from rest_framework.serializers import (ModelSerializer,
                                            HyperlinkedIdentityField,
                                            SerializerMethodField)
    
    User = get_user_model()  
    
    
    class UserCreateSerializer(ModelSerializer):
       class Meta:
           model = User
           fields = [
            'username',
            'email',
            'password',
           ]
        extra_kwargs = {
            'password': {'write_only': True}
        }
    
    def create(self, validated_data):
       username = validated_data['username']
       email = validated_data['email']
       password = validated_data['password']
       user_obj = User(username=username,
                        email=email)
       user_obj.set_password(password)
       user_obj.save()
       return validated_data
    

    【讨论】:

      【解决方案2】:

      您的创建方法应返回user_obj 而不是validate_data。在您调用 set_password 之后,您的字符串 password 似乎覆盖了对象密码字段,也许是您代码中的其他地方?

      【讨论】:

        【解决方案3】:

        这个问题可以这样解决

        class  CreateUserSerializer(serializers.ModelSerializer):
        class Meta:
            model = User
            fields = [
                'username',
                'password',
            ]
            extra_kwargs = {
                'password' : {'write_only' : True},
            }
        
        def create(self,validate_data):
        
            user = User.objects.create_user(username = validate_data['username'] , password = validate_data['password'])
        
            return user
        

        Views.py(只是调用行)

                        temp_data = {
                            'username' : username,
                            'password' : password,
                        }
                        serializer = CreateUserSerializer(data = temp_data)
                        serializer.is_valid(raise_exception = True)                    
                        user = serializer.save()
        

        create_user 将负责散列。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-21
          • 2012-05-06
          相关资源
          最近更新 更多