회원으로 인증 받기(로그인) 위해서 필요한 절차는?
보통 로그인은 내가 입력한 username, password 값을 회원가입 때 저장된 username, password 값과 대조하는 시스템이다.
로그인 폼을 만들어 username과 password를 입력하고,
view에서 전달 받은 username과 password를 갖고 데이터베이스에 저장된 데이터와 대조하여 인증 절차를 거친다.
(인증 기능을 갖고 있는 authenticate 함수를 활용한다)
그 결과 회원 인증 완료시 원하는 페이지를 출력한다.
1) 로그인 폼을 만들어 username과 password 입력칸을 만든다
| {% block body %} <div class="container"> <form method="post" action="" class="form-signin"> {% csrf_token %} <h2 class="form-signin-heading">Please log in</h2> <input type="username" name="username" class="form-control" placeholder="Username" required="" autofocus=""> <input type="password" name="password" class="form-control" placeholder="Password" required=""> <button class="btn btn-lg btn-primary btn-block" type="submit">Log in</button> </form> </div> {% endblock %} | cs |
view에서 인증처리하는 방식에 대한 설명은 아래와 같다.
(https://docs.djangoproject.com/en/1.10/topics/auth/default/#how-to-log-a-user-in)
| from django.contrib.auth import authenticate, login def my_view(request): username = request.POST['username'] password = request.POST['password'] user = authenticate(username=username, password=password) if user is not None: login(request, user) # Redirect to a success page. else: # Return an 'invalid login' error message. | cs |
로그인 폼에서 입력 받은 username과 password 값을 authenticate 함수를 통해 인증 절차를 거치고,
if문을 작성하여 확인 여부에 따라 로그인 처리를 하는 login 함수를 사용한다.
로그인에 성공하면 원하는 페이지로 redirect 시킬 수 있게 url을 입력한다.
2) authenticate 함수와 login 함수를 적용한다
| def login(request): if request.method == "GET": pass elif request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") user = authenticate(username=username, password=password) if user is not None: auth_login(request, user) else: pass return redirect("/partner/") | cs |
login에서 auth_login으로 바뀐 까닭은?
이미 view의 이름으로 login이 존재하므로 중복사용을 피하고자 다른 명칭으로 login 함수를 사용해야한다.
안그러면 오류가 발생하는데 이유는 최초에 쓰인 login 함수가 2개의 인자를 받지 않고 request 한 개만 받고 있기 때문이다.
이를 위해 함수를 import할 때 전치사 "as"를 사용하여 auth_login으로 사용함을 명시해주어야한다.
| from django.contrib.auth import authenticate, login as auth_login | cs |
그럼 중복을 피하면서 똑같은 기능을 유지할 수 있다.
이번에는 로그인에 실패한 경우 실패메시지를 보내도록 설정해보자.
로그인 폼에서 입력 받은 정보가 똑같이 데이터베이스로 전달되지만,
User 모델에 저장된 회원 정보와 다를 경우 login 처리를 시키지 않고,
로그인 폼 아래에 "존재하지 않는 사용자"라는 텍스트만 전달할 뿐 어떠한 변화를 주지 않는다.
| else: ctx.update({ "error" : "존재하지 않는 사용자입니다." }) | cs |
비어있는 ctx 변수의 값을 변경하는 방식으로 메시지 전달 방식을 택했다.
| <div class="container"> <form method="post" action="" class="form-signin"> {% csrf_token %} <h2 class="form-signin-heading">Please log in</h2> <input type="username" name="username" class="form-control" placeholder="Username" required="" autofocus=""> <input type="password" name="password" class="form-control" placeholder="Password" required=""> {{ error }} <button class="btn btn-lg btn-primary btn-block" type="submit">Log in</button> </form> </div> | cs |
로그아웃 하기
로그아웃은 로그인시 사용된 우리의 정보가 떨어져 나가게 하는 시스템이다.
따라서 로그인과 다른 점은, 데이터 입력이 필요 없다. logout 함수만 사용하면 로그아웃 완료된다.
| def logout(request): auth_logout(request) return redirect("/partner/") | cs |
단, 로그아웃 버튼에 대한 url 주소를 추가할 필요가 있다. 그래야 logout 함수가 활성화된다.
| from django.conf.urls import url from .views import index, signup, login, logout urlpatterns = [ url(r'^$', index, name='index'), url(r'^signup/$', signup, name='signup'), url(r'^login/$', login, name='login'), url(r'^logout/$', logout, name='logout'), ] | cs |