Запрос на совпадение пользователя не существует: Django - PullRequest
0 голосов
/ 23 апреля 2020

Я делаю систему аутентификации пользователя при входе в систему. я получаю сообщение об ошибке Запрос на сопоставление пользователя не существует . Я думаю, что это пришло из ORM при получении запроса, но я не совсем уверен, почему запрос не завершается при сопоставлении пользователя. было бы здорово, если бы кто-нибудь смог мне понять, что я пытаюсь решить. заранее большое спасибо.

здесь ниже мой рабочий код;

class LoginAPIView(APIView):

    def post(self, request, format=None):
        #gather the username and password provided by user
        data = request.data
        email = data['email']
        user_password = data['password']

        user_entered_password = user_password
        salt = "5gz"
        db_password = user_entered_password + salt
        hash_password = hashlib.md5(db_password.encode())
        print(hash_password.hexdigest())


        user_queryset = User.objects.all().get(Q(email__exact=email) & Q(password__exact=hash_password.hexdigest())).first()

        # user_ser = UserLoginSerializers(user_queryset,many=True)
        # user_data = user_ser.user_queryset

        user_id = []
        for u in user_queryset:
            _id = u.get('id')
            user_id.append(_id)

        if len(user_queryset) > 0:
            print(user_id)
            payload ={'user_id':user_id[0], 'exp':datetime.utcnow() + timedelta(seconds=JWT_EXP_DELTA_SECONDS)}
            jwt_token = jwt.encode(payload, JWT_SECRET, JWT_ALGORITHM)

            return Response({'token':jwt_token, "data":user_queryset}, status=status.HTTP_200_OK)
        else:
            return Response({"msg":"Invalid User"}, status=status.HTTP_400_BAD_REQUEST)


1 Ответ

0 голосов
/ 23 апреля 2020

Вам не нужно делать все это самостоятельно. Django имеет функцию authenticate, которая принимает имя пользователя и пароль и возвращает вам пользователя.

from django.contrib.auth import authenticate

user = authenticate(username='your_username', password='you_password')

Django по умолчанию выполняет аутентификацию с именем пользователя. Если вы хотите использовать электронную почту для этого, вы можете сделать один из них.

  1. Использовать электронную почту пользователя в качестве его имени пользователя. При этом вам не нужно будет вносить какие-либо изменения в систему аутентификации
  2. Написать собственный метод аутентификации. Это будет так.

код:

from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend

class EmailBackend(ModelBackend):
    def authenticate(self, 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

Затем установите этот бэкэнд в качестве вашего аутентификационного бэкенда в настройках:

AUTHENTICATION_BACKENDS = ['path.to.auth.module.EmailBackend']
...