Python 在Django中注册用户时密码未加密
序列化程序.pyPython 在Django中注册用户时密码未加密,python,django,Python,Django,序列化程序.py class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('id', 'username', 'email') class RegisterSerializer(serializers.ModelSerializer): class Meta: model = User fields
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
class RegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User(validated_data['username'], validated_data['email'])
user.set_password(validated_data['password'])
user.save()
return user
views.py
class RegisterAPI(generics.GenericAPIView):
serializer_class = RegisterSerializer
def post(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.save()
print("user = ",user)
return Response({
"user": UserSerializer(user, context=self.get_serializer_context()).data,
"token": AuthToken.objects.create(user)[1]
})
# Create your views here.
class LoginAPI(KnoxLoginView):
permission_classes = (permissions.AllowAny,)
def post(self, request, format=None):
serializer = AuthTokenSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
login(request, user)
return super(LoginAPI, self).post(request, format=None)
# Get User API
class UserAPI(generics.RetrieveAPIView):
permission_classes = [permissions.IsAuthenticated,]
serializer_class = UserSerializer
def get_object(self):
return self.request.user
密码未以指定格式加密,因此登录API也无法工作。它表明-
“非字段错误”:[
“无法使用提供的凭据登录。”
]
另外,在django的管理面板中,它显示了更新“RegisterSerializer”类的“create”方法
别忘了导入make_密码方法
from django.contrib.auth.hashers import make_password
并且您创建的方法没有正确缩进
序列化程序.py
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
class RegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User(validated_data['username'], validated_data['email'])
user.set_password(validated_data['password'])
user.save()
return user
您使用的是AbstractBaseUsers吗?我想不是,从哪里可以找到这个?从哪里可以从django.contrib.auth.models import User获得这个模型用户
,
我使用了这个我尝试了您的解决方案,但同样的错误仍然存在:User=User.objects.create_User(password=validated_data['password'],username=validated_data['username'],email=validated_data['email'])
返回用户
是否检查了“RegisterSerializer”类“create”方法的缩进?我认为“create”方法没有正确缩进,但在您的问题中serializer.py文件没有正确缩进。我已经更新了我的答案,你可以再次验证。非常感谢。现在密码被加密了。我认为create方法在Meta类中。
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email')
class RegisterSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ('id', 'username', 'email', 'password')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
user = User(validated_data['username'], validated_data['email'])
user.set_password(validated_data['password'])
user.save()
return user