이번에는 로그인을 할 수 있는 뷰를 만든다.
signin 브랜치에 다음의 내용을 구현한다.
- 이메일, 비밀번호를 전달받아 로그인을 할 수 있다.
- 계정 및 비밀번호가 전달되지 않은 경우 KeyError를 발생한다.
- 계정 또는 비밀번호가 일치 하지 않는 경우
Invalid_user
를 반환한다.
from json
from django.views import View
from django.http import JsonResponse
from user.models import User
class SingInView(View):
user_data = json.loads(request.body)
try:
user_email = user_data['email']
user_password = user_data['password']
if not User.objects.filter(
email=user_email,
user_password=user_password).exists():
return JsonResponse({"message": "INVALID_USER"}, status=401)
return JsonResponse({"message": "SUCCESS"}, status=200)
except KeyError:
return JsonResponse({"message": "KEY_ERROR"}, status=400)
if not User.objects.filter(email=user_email).exists() or not User.objects.filter(password=user_password).exists()
이렇게 작성하였다. 하지만 filter는 여러개 조건을 ,
로 넣을 수 있기 때문에 저렇게 길게 작성할 필요가 없었다. User.objects.filter(Q(email=user_email) | Q(password=user_password)).exists()
가 아닐까 했는데 이렇게 하면 문제가 아이디나 패스워드 둘중에 하나만 일치해도 로그인이 되어버린다. 따라서 and(filter에선 ,로 구분되는)
로 조건을 써서 작성을 해야 올바르게 동작한다!!