Nonamed Develog
[TIL][240902] 장고 기초 이해도 테스트 오답 노트 본문
14. Django에서 사용자가 로그인할 수 있는 간단한 로그인 뷰를 작성하세요.
- 사용자가 로그인 폼을 제출했을 때, 해당 사용자를 인증하고, 성공적으로 로그인할 경우 'home' 페이지로 리디렉션합니다.
- 로그인 실패 시 다시 로그인 페이지로 리디렉션하며, 실패 메시지를 출력하세요.
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
def login_view(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
# 이곳에 코드를 작성해 주세요.
return render(request, 'login.html')
제출한 코드
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
def login_view(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
# 이곳에 코드를 작성해 주세요.
if User.objects.get(username=username).exists():
user = User.objects.get(username=username)
if user.check_password(password):
login(request, user)
return redirect('home')
else:
print("로그인 실패")
else:
print("로그인 실패")
return render(request, 'login.html')
정답 코드
from django.shortcuts import render, redirect
from django.contrib.auth import authenticate, login
def login_view(request):
if request.method == 'POST':
username = request.POST['username']
password = request.POST['password']
user = authenticate(request, username=username, password=password)
if user is not None:
login(request, user)
return redirect('home')
else:
messages.error(request, 'Invalid username or password')
return redirect('login')
return render(request, 'login.html')
- authenticate() 함수의 부재
authenticate() 함수를 사용하지 않고, 직접 사용자 객체를 가져와서 비밀번호를 확인하는 로직을 짰지만, 주어진 문제에서 import authenticate를 봤어야 했다.(봐도 못썼겠지만...) 결론적으로 authenticate() 함수를 사용하지 않고 직접 User 객체를 조회하고 비밀번호를 확인하는 것은 Django에 내장된 인증 시스템을 재치는 것이기 때문에, 보안상 문제가 될 수 있다고 생각했다.- authenticated() 활용
user = authenticate(request, username=username, password=password)
username과 password를 받아 Django의 내장 인증 과정을 거쳐 검증한다. 인증에 성공하면 user 변수에 User 객체가 할당되고, 실패하면 None이 반환된다. 반환된 값을 활용하여 로그인 성공 여부를 확인 할 수 있다.
- message.error() 함수 사용
로그인 실패 시 "로그인 실패" 메세지를 print 문으로 출력했지만, 사용자에게 메시지를 전달하는 방법이 아니었다. print문을 사용해 터미널에 메시지를 출력하는 것은 사용자에게 영향을 주지 않기 때문이다. 정답과 같이 message.error를 사용하면 사용자에게 오류 메시지를 전달할 수 있다는 것을 알았다.- message.error 활용
messages.error(request, 'Invalid username or password')
사용자가 잘못된 입력을 했을 때, 오류 메시지를 설정하여 로그인 페이지에서 해당 메시지를 표시할 수 있도록 한다. 템플릿에서 {{ message }}를 사용하여 메시지를 출력하여 사용자에게 피드백을 줄 수 있다.
- User.objects.get(username=username) 대신 filter() 사용
User.objects.get(username=username)을 사용하여 사용자가 존재하는지 확인하려 했지만, 사용자가 존재하지 않을 경우 DoesNotExist 예외를 발생시킨다. 따라서 filter()를 사용하는 것이 더 안전했다.
User.objects.filter(username=username).exists()
위의 코드를 이용하여 사용자의 존재 여부를 확인하고, 사용자가 존재하지 않더라고 예외를 발생시키지 않기 때문에 코드의 안정성을 높일 수 있다.
- 로그인 실패 시 처리
로그인 실패 시 메시지를 출력하고, 로그인 페이지를 다시 redirect 했어야 했다. 위 언급했던 message.error와 함께 오류 메시지를 제공하고, 로그인 페이지로 redirect 했어야 했다.
'WHAT I LEARN > TIL' 카테고리의 다른 글
[TIL][240904] Troubleshooting 1: validaors.py의 활용 (0) | 2024.09.04 |
---|---|
[TIL][240903] RESTful API (1) | 2024.09.03 |
[TIL][240830] APIView, GenericAPIView, Mixin, ViewSet (0) | 2024.08.30 |
[TIL][240829] RESTful API, DRF 기초 (0) | 2024.08.29 |
[TIL][240823] HTML 드롭다운 선택 문제 해결 (0) | 2024.08.23 |