기존 만들었던 register.html 에서 이메일과 비밀번호 확인만 지워서 login.html 로 member app 내 templates 폴더에 저장해 주었다.
일단 연결이 되는지만 확인하기 위해 login.html 로 render 하게 리턴만 했다.
def login(request):
return render(request, 'login.html')
어떤 주소로 들어왔을 때 이 'def login' 이 코드를 실행하도록 연결해 줄 것인지 설정한다.
# member/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('register/', views.register),
path('login/', views.login),
]
http://127.0.0.1:8000/member/login 경로로 접속했을 때 views.login 함수가 실행되어 'login.html' 파일을 요청과 함께 렌더 해 준다.
회원가입과 마찬가지로 method 에 따라 GET, POST 2갈래로 분기하여 코드를 작성한다.
GET 으로 들어오는 것은 그냥 화면을 띄워 주면 된다.
if request.method == "GET":
return render(request, 'login.html')
POST 는 username 과 password 를 받아오게 한다.
elif request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
res_data = {}
if not (username and password):
res_data['error'] = '모든 값을 입력하세요!'
그전에 먼저 모델로부터 username 을 가져온다.
# 바로 위 if 에 대한 else 코드 작성
else:
member = BoardMember.objects.get(username = username)
# 앞의 username 은 필드명, 모델안에서 어떤 속성값을 나타내는 것이고, 뒤의 username 은
위에 로그인 할 때 입력받은 username 을 'username' 이라는 변수명에 담은 것이다.
그러면 입력한 아이디를 가진 모델 객체를 컴퓨터가 데이터베이스에서 찾아서 가지고 나온다.
음 'teddyjung' 을 로그인 시 입력했고 이 username 을 불러와서 member 변수에 할당한다 로 이해하면 될까.
모델로부터 username 을 가져왔으니 이제 그 username 에 대한 비밀번호를 비교해 보자.
# views.py
from django.contrib.auth.hashers import make_password, check_password
""" 중략 """
else:
member = BoardMember.objects.get(username = username)
if check_password(password, member.password):
pass
# 비밀번호가 일치하는 경우이므로, 로그인 처리를 하는 세션과 리다이렉트를 적용할 예정이다.
else:
res_data['error'] = '비밀번호가 다릅니다!'
check_password 에 담긴 앞에 password 는 로그인 시 입력받은 password 이고, 뒤의 member.password 는 모델로부터 가지고 온 값이다.
실제 python manage.py shell 로 확인해보면 아래와 같다.
>>> a = BoardMember.objects.get(username='teddyjung18')
>>> a
<BoardMember: teddyjung18>
>>> a.email
'teddy.jellyboy@gmail.com'
>>> a.password
'pbkdf2_sha256$180000$7nfs79NQcoNt$DlJo1awBze/4AdKQo/eJ92X4i0fsB0iSLHTdvzLsmwo='
서로 일치하면 로그인 처리를 하는데 이를 위해서는 세션을 사용해서 실제로 로그인이 된 것처럼 처리를 해야 한다.
이 때, 세션과 리다이렉트가 필요하다.
위의 pass 코드 대신 입력하게 될 예정이다.
일반적으로 로그인을 하게 되면 로그인 창에서 메인 홈으로 이동하는 등 다른 창으로 넘어갈 것이다. 보통 홈으로 가니까 그 코드를 작성한다. 이것을 리다이렉트라 한다.
def login(request):
if request.method == "GET":
return render(request, 'login.html')
elif request.method == "POST":
username = request.POST.get('username', None)
password = request.POST.get('password', None)
res_data ={}
if not (username and password):
res_data['error'] = '모든 값을 입력하세요!'
else:
member = BoardMember.objects.get(username=username)
if check_password(password, member.password):
pass
# session!
# redirect!
else:
res_data['error'] = '비밀번호가 다릅니다!'
return render(request, 'login.html', res_data)