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()方法来创建,密码会自动进行加密后存放到数据库。就轻松搞定。