DRF로 프로젝트를 하기에 앞서, 개발에 온전히 집중하지 못해 소실된 기억을 되찾고자 Django로 프로젝트를 하고 있다.
단순히 이전 프로젝트에서 사용했던 코드를 따라 적는 것보다 정확히 무슨 의미인지, 왜 필요한지 계속 질문을 하면서 진행하고 있다.
👀 오늘의 첫 번째 궁금증은
회원 탈퇴를 할 수 있게 인증을 하는 과정에서 사용하는
@login_required
와is_authenticated
가 어떻게 다른지 궁금했다.
둘 다 '로그인한 유저'만을 위한 것이 아닌가? 라는 생각이 끊이질 않았다.
약, 10년 전 포스팅이지만 🔗스택 오버 플로우에서는 is_aunthenticated
는 좀 더 유연하고, @login_required
는 선언적(어떻게 보다는 무엇에 가까운)이라는 답이 있었다. 선언적이라는 의미는 여기에서 잘 설명하셨다.
더 깊게 이해해보자!
is_authenticated
는 공식 문서에 의하면 사용자가 인증되었는지 확인하는 방법이라고 한다. 로그인 되어 있다면, True이다.
이는 template에서 바로 확인할 수 있다.
{% if user.is_authenticated %}
<p>이 유저는 로그인 되어 있습니다.</p>
{% else %}
<p>이 유저는 로그아웃 되어 있습니다.</p>
{% endif %}
페이지를 접속했을 때 로그인 여부에 따라 다르게 화면에 다르게 출력된다.
django에서 제공하는 django.contrib.auth.decorators
모듈 안에 있는 데코레이터이다. (데코레이터는 함수를 수정하지 않은 상태에서 추가 기능을 구현할 때 사용하는 것이라고 이해하자.)
이는 유저가 로그인하지 않았다면, login.url로 리다이렉트하고, 로그인했다면 views.py
에서 정의한 함수 혹은 메서드에 접근 가능하게 한다.
➡️ 즉, @login_required
는 로그인 하지 않으면 접근이 불가능하게 만드는 기능이고, is_authenticated
는 로그인의 여부만 검증 하는 것이다.
따라서, 회원정보 수정의 경우, 로그인을 한 사람만 가능하므로 다음과 같이 @login_required
를 사용하고
@login_required
def update(request):
if request.method == 'POST':
form = CustomUserChangeForm(request.POST, instance=request.user)
if form.is_valid():
form.save()
return redirect('accounts:detail', request.user.pk)
else:
form = CustomUserChangeForm(instance=request.user)
context = {
'form': form
}
return render(request, 'accounts/update.html', context)
회원가입 후에 자동으로 로그인이 되도록 다음과 같이 is_authenticated
를 사용한다.
def signup(request):
# 이미 로그인된 사람은 companies:index 로 보내기
if request.user.is_authenticated:
return redirect('companies:index')
else:
if request.method == 'POST':
form = CustomUserCreationForm(request.POST)
if form.is_valid():
# 바로 로그인 되도록 새로 추가된 코드
user = form.save()
auth_login(request, user)
return redirect('companies:index')
else:
form = CustomUserCreationForm()
context = {
'form': form
}
return render(request, 'accounts/signup.html', context)
참고