DRF当中序列化器中通过重写create()来实现保护登录保护

在DRF原来源码框架中,我们知道保存的用户信息时,用户的密码是被明文保存到数据库中。

代码实class UserRegisterModelSerializer(serializers.ModelSerializer)    """

    用户注册的序列化器
    """
    re_password = serializers.CharField(required=True, write_only=True, help_text="确认密码")
   
    class Meta:
        model = User
        fields = ["mobile", "password", "re_password", ]
        extra_kwargs = {
            "mobile": {
                "required": True, "write_only": True
            },
            "password": {
                "required": True, "write_only": True, "min_length": 6, "max_length": 16,
            },
        }
            # 全局钩子函数
        def validate(self, data):
            """验证客户端数据"""
            # 手机号格式验证
            mobile = data.get("mobile", None)
            if not re.match("^1[3-9]\d{9}$", mobile):
                raise serializers.ValidationError(detail="手机号格式不正确!", code="mobile")

            # 密码和确认密码
            password = data.get("password")
            re_password = data.get("re_password")
            if password != re_password:
                # ValidationError(detail="",code="")  两个参数是根据源码
                raise serializers.ValidationError(detail="密码和确认密码不一致!", code="password")

            # 手机号是否已注册
            try:
                User.objects.get(mobile=mobile)
                raise serializers.ValidationError(detail="手机号已注册!")
            except User.DoesNotExist:
                pass
returndef create(self, validated_data):
        """保存用户信息,完成注册"""
        mobile = validated_data.get("mobile")
        password = validated_data.get("password")

        user = User.objects.create_user(
            username=mobile,
            mobile=mobile,
            avatar=constants.DEFAULT_USER_AVATAR,
            password=password,
        )

return user
通过重写序列化器中的create(),使用create_user()方法来创建,密码会自动进行加密后存放到数据库。就轻松搞定。

posted on 2022-08-25 14:40  一先生94  阅读(215)  评论(0编辑  收藏  举报

导航