django에서 로그인/로그아웃이 처리되는 과정을 좀 더 자세히 알아보기
이전에 만들었던 쇼핑몰 프로젝트에서는 다음과 같은 코드에 의해 로그인이 진행된다.
# user/views.py
from django.contrib.auth import authenticate, login
...
def login_form(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)
current_user =request.user
userprofile=UserProfile.objects.get(user_id=current_user.id)
return HttpResponseRedirect('/')
else:
messages.warning(request,"아이디 혹은 패스워드 오류입니다!")
return HttpResponseRedirect('/login')
context = {}
return render(request, 'user/login.html', context)
django.contrib.auth 모듈의 아래 두 함수가 로그인 처리에 사용된다.
authenticate(request=None, **credentials)
login(request, user, backend=None)
로그아웃을 하면 각각 나누어 갖고 있는 session 정보를 삭제하게 된다.
# django/contrib/auth/__init__.py
def logout(request):
"""
Remove the authenticated user's ID from the request and flush their session
data.
"""
# Dispatch the signal before the user is logged out so the receivers have a
# chance to find out *who* logged out.
user = getattr(request, 'user', None)
if not getattr(user, 'is_authenticated', True):
user = None
user_logged_out.send(sender=user.__class__, request=request, user=user)
request.session.flush()
if hasattr(request, 'user'):
from django.contrib.auth.models import AnonymousUser
request.user = AnonymousUser()
django.contrib.auth 모듈에 있는 logout 함수이다.
request.session.flush()
에서 flush 메서드는 브라우저와 DB 양쪽에 저장된 session 데이터를 삭제하는 역할을 한다.