这是我的登录路径
from rest_framework.authtoken.views import obtain_auth_token
urlpatterns = [
...
path('login/', obtain_auth_token),
]
当我使用它作为登录名时,它使用用户名(尽管它使用电子邮件作为字段数据(&密码并为我生成令牌
{
"username": "manig@gmail.com",
"password" : "manig@gmail.com"
}
{
"email": "manig@gmail.com",
"password" : "manig@gmail.com"
}
我想用电子邮件替换用户名!!我应该如何修改?
到目前为止,我所尝试的是:我已经制作了自定义序列化程序
class AuthTokenSerializer(serializers.ModelSerializer):
class Meta:
model = AuthUser
fields = ('email', 'password')
extra_kwargs = {'password': {'write_only': True}}
def validate(self, data):
user_obj = None
email = data.get('email')
password = data.get('password')
if email and password:
user_obj = AuthUser.objects.filter(email=email).first()
if not user_obj:
raise serializers.ValidationError("This email is not registered")
if not user_obj.check_password(password):
raise serializers.ValidationError("Incorrect credentials")
return data
def create(self, validated_data):
user = AuthUser.objects.get(email=validated_data['email'])
refresh = RefreshToken.for_user(user)
return {
'user': user,
'token': str(refresh.access_token)
}
这是的观点
class AuthLoginUser(ObtainAuthToken):
def post(self, request, *args, **kwargs):
serializer = AuthTokenSerializer(data=request.data, context={'request': request})
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
token, created = Token.objects.get_or_create(user=user)
return Response({
'token': token.key,
'first_name': user.first_name,
'last_name': user.last_name,
'email': user.email,
'role': user.role
})
这就是url模式的
urlpatterns = [
...
path('login/', views.AuthLoginUser.as_view()),
]
当我这样做时,它确实用电子邮件替换了用户名字段,但当我登录/通过端点传递数据时
我得到的错误,我不应该
它开始给我这个错误,使用此电子邮件的用户已经存在,相反,它应该根据自定义序列化程序和视图类,用令牌、名字、姓氏电子邮件和角色进行回复。
请帮助我缓解这个问题
您应该只使用ModelSerializer.create
来创建新实例;您会得到这个错误,因为序列化程序执行验证时就像您在创建一个新实例一样。更改您的序列化程序:
class AuthTokenSerializer(serializers.Serializer):
email = serializers.EmailField(write_only=True)
password = serializers.CharField(write_only=True, style={'input_type': 'password'})
def validate(self, data):
email = data.get('email')
password = data.get('password')
if email and password:
try:
user_obj = AuthUser.objects.get(email=email)
if not user_obj.check_password(password):
raise serializers.ValidationError("Incorrect credentials")
data['user'] = user_obj
except AuthUser.DoesNotExist:
raise serializers.ValidationError("This email is not registered")
else:
raise serializers.ValidationError("Missing credentials")
return data
def save(self):
user = AuthUser.objects.get(email=self.validated_data['email'])
refresh = RefreshToken.for_user(user)
return {
'user': user,
'token': str(refresh.access_token)
}
我调整了验证,并将create
的代码放入save
方法中,但我认为您可以删除save
,因为您在视图中没有使用它。