Проверка правильности пароля пользователя в django rest framework

Я пишу пользовательскую функциональность входа в систему на фреймворке Django rest. Но я не могу проверить, верен ли пароль или нет.

class LoginView(APIView):
def post(self, request):
    username=request.data["username"]
    password=request.data["password"]
    user=User.objects.filter(username=username)
    if user is None:
        return Response({"response":"No User exist"})
    if user.check_password(password):
        return Response({"response":"correct Password"})
    return Response({"data":"done"})

проблема в том, что функция check_password не работает. Есть ли какой-нибудь правильный способ сделать это или я что-то упустил?

Посмотрите документацию здесь https://docs.djangoproject.com/en/4.1/topics/auth/passwords/#django.contrib.auth.hashers.check_password

Необходимо сравнить простой пароль в request.data["password"], с паролем пользователя в БД.

from django.contrib.auth import authenticate

class LoginView(APIView):
def post(self, request):
    username=request.data["username"]
    password=request.data["password"]
    user = authenticate(request, username=username, password=password)
    if user is None:
        return Response({"response":"No User exist"})
    else:
        return Response({"response":"correct Password"})

Взгляните на эту:

def login(request):
    if request.method == 'POST':
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(request, username=username, password=password)
        if user is not None:
            auth.login(request, user)
            return redirect('Home')
        else:
            messages.info(request, 'Invalid Credential') 
            return redirect('login')
    else:        
        return render(request, 'login.html')

передайте это в вашем шаблоне:

<div class="text-center text-danger">
     {% for message in messages %}
          <h5>{{ message }}</h5>
      {% endfor %}
   <br>
</div>

Исправил эту проблему, сделав обновление, я изменил filter() на get(), так как filter() возвращает набор запросов, а get () возвращает объект.

Обновленный код :

class LoginView(APIView):
def post(self, request):
    username=request.data["username"]
    password=request.data["password"]
    user=User.objects.get(username=username)
    if user is None:
        return Response({"response":"No User exist"})
    if not user.check_password(password):
        return Response({"response":"incorrect Password"})
    return Response({"data":"done"})

Если кто-то все еще не может понять разницу между обеими функциями (get и filter). Пожалуйста, посмотрите ссылку Разница между методами filter() и get() в Django..

Спасибо всем, кто помогает в решении проблемы.

Вернуться на верх