【发布时间】:2020-12-02 21:44:11
【问题描述】:
我正在尝试使用 drf 登录后生成令牌。我正在使用 emailbackend 使用电子邮件和密码登录,但它不能与 api 创建的用户和管理员创建的用户一起工作
后端.py:
class EmailBackend(ModelBackend):
def authenticate(self, request, username=None, password=None, **kwargs):
UserModel = get_user_model()
try:
user = UserModel.objects.get(email=username)
except UserModel.DoesNotExist:
return None
else:
if user.check_password(password):
return user
return None
令牌序列化器:
class AuthCustomTokenSerializer(serializers.Serializer):
'''
Changing Token auth to use email instead username
'''
email = serializers.EmailField(label=_("Email"))
password = serializers.CharField(
label=_("Password",),
style={'input_type': 'password'},
trim_whitespace=False
)
def validate(self, attrs):
email = attrs.get('email')
password = attrs.get('password')
print(email, password)
if email and password:
user = authenticate(username=email, password=password)
print("this is user", user)
# The authenticate call simply returns None for is_active=False
# users. (Assuming the default ModelBackend authentication
# backend.)
if not user:
msg = _('Unable to log in with provided credentials.')
raise serializers.ValidationError(msg, code='authorization')
else:
msg = _('Must include "username" and "password".')
raise serializers.ValidationError(msg, code='authorization')
attrs['user'] = user
return attrs
登录视图:
@csrf_exempt
@api_view(["POST"])
@permission_classes((AllowAny,))
def login(request):
serializer = AuthCustomTokenSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
token, _ = Token.objects.get_or_create(user=user)
return Response({token: token.key}, status=status.HTTP_200_OK)
注册api:
【问题讨论】:
-
什么是 Q ?
-
验证功能不适用于由 api 创建的用户,但它与由管理员创建的用户一起使用
-
但您只显示凭据序列/视图。显示你的代码:)
-
也 - 不工作怎么办?显示你的错误。显示您的请求 ....etc 等
-
查看编辑,它似乎从 AuthCustomTokenSerializer 上的 user = authenticate(username=email, password=password) 返回 None
标签: python-3.x django django-rest-framework