Проверка правильности пароля пользователя в 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..
Спасибо всем, кто помогает в решении проблемы.