스타일쉐어의 로그인을 구현할 때 하나 간과한게 있었는데, 아이디나 이메일 둘 중 하나만 맞으면 로그인이 가능하다는 점이었습니다. 그래서 처음에는 아이디만 체크해서 회원이면 로그인이 가능하도록 비밀번호 체크 로직으로 넘겼는데, 이메일도 체크하도록 변경해야했습니다.
별 생각없이 아이디가 들어오면 if 문으로 처음 처리하고, 아이디가 안들어오면 elif 문으로 두 번째 조건으로 처리하게 코드를 작성했었는데, user
를 지칭하는 변수가 중복으로 나오게되서 중복을 줄이고 싶었습니다.
이를 위해서는 Django ORM에서 둘 중 하나의 조건을 만족하는 값을 찾아야했는데, 여기서는 Q
를 활용해서 해결했습니다.
Django ORM에서 Q
는 SQL의 WHERE의 역할을 합니다. 불러들일 데이터의 조건을 설정하는 역할이죠.
Q
를 사용하기 위해서는 먼저 django.db
에서 import 해줘야합니다.
from django.db.models import Q
그리고 나서 아래와 같이 조건이 필요한 곳에 사용해주면 됩니다.
여기서는 프론트로부터 입력 받은 로그인아이디와 일치하는 로그인아이디가 DB에 있거나, 입력 받은 이메일과 일치하는 이메일이 DB에 존재하는지 확인하고, 둘 중 하나가 존재한다면 이 조건을 만족하는 user 객체를 불러와서 저장하는 용도로 사용했습니다.
if User.objects.filter(Q(login_id = login_id)|Q(email=email)).exists():
user = User.objects.filter(Q(login_id = login_id)|Q(email = email))[0]
from django.db.models import Q
class SignInView(View):
def post(self, request):
data = json.loads(request.body)
login_id = data.get('login_id', None)
email = data.get('email', None)
try:
if User.objects.filter(Q(login_id = login_id)|Q(email=email)).exists():
user = User.objects.filter(Q(login_id = login_id)|Q(email = email))[0]
if bcrypt.checkpw(data['password'].encode('utf-8'), user.password.encode('utf-8')):
token = jwt.encode({'login_id':user.login_id}, SECRET_KEY, algorithm = 'HS256')
return JsonResponse({"token":token.decode('utf-8')}, status = 200)
return HttpResponse(status = 401)
return HttpResponse(status = 400)
except KeyError:
return JsonResponse({"message":"INVALID_KEYS"}, status = 400)