如何将默认用户名更改为电子邮件,在DRF中获取令牌登录



这是我的登录路径

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,因为您在视图中没有使用它。

最新更新