Django 로 게시판 만들기(10). Login 화면 templates 만들기, login 함수 작성

.·2020년 7월 25일
1

게시판만들기

목록 보기
10/21

1. Login 화면 templates 만들기

기존 만들었던 register.html 에서 이메일과 비밀번호 확인만 지워서 login.html 로 member app 내 templates 폴더에 저장해 주었다.

2. view 를 만들어서 연결하기 (테스트)

2-1. member app 의 views.py 내에 로그인 로직을 구현하는 함수 코드를 작성한다.

일단 연결이 되는지만 확인하기 위해 login.html 로 render 하게 리턴만 했다.

def login(request):
    return render(request, 'login.html')

2-2. login 함수 코드를 연결할 엔드포인트 설정

어떤 주소로 들어왔을 때 이 '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' 파일을 요청과 함께 렌더 해 준다.

3. 로그인 view 코드 작성하기

회원가입과 마찬가지로 method 에 따라 GET, POST 2갈래로 분기하여 코드를 작성한다.

3-1. GET

GET 으로 들어오는 것은 그냥 화면을 띄워 주면 된다.

if request.method == "GET":
    return render(request, 'login.html')

3-2. POST

POST 는 username 과 password 를 받아오게 한다.

elif request.method == "POST":
    username = request.POST.get('username')
    password = request.POST.get('password')

여기서 2가지를 확인해야 한다.

  • 로그인 진행 시 사용자가 모든 값을 입력했는지 (그렇지 않다면 빈 딕셔너리 만들어서 에러메시지 추가)
res_data = {}
if not (username and password):
    res_data['error'] = '모든 값을 입력하세요!'
  • 모든 값을 입력 했어도 그 입력한 비밀번호가 데이터베이스 내에 저장된 비밀번호와 일치하는지
    : 앞전에 회원가입을 했을 때 DB에 모델로 저장을 했다. 이 모델로부터 가져와야 하는데 그 기준이 username 이다. 이 아이디를 사용하고 있는 BoardMember 모델을 가져와서 내가 입력받은 비밀번호와 DB안에 있는 비밀번호가 일치하는지 확인해야 한다.

그전에 먼저 모델로부터 username 을 가져온다.

username 가져오기

# 바로 위 if 에 대한 else 코드 작성
else:
    member = BoardMember.objects.get(username = username)
    # 앞의 username 은 필드명, 모델안에서 어떤 속성값을 나타내는 것이고, 뒤의 username 은 
    위에 로그인 할 때 입력받은 username 을 'username' 이라는 변수명에 담은 것이다.

그러면 입력한 아이디를 가진 모델 객체를 컴퓨터가 데이터베이스에서 찾아서 가지고 나온다.

음 'teddyjung' 을 로그인 시 입력했고 이 username 을 불러와서 member 변수에 할당한다 로 이해하면 될까.

모델로부터 username 을 가져왔으니 이제 그 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 코드 대신 입력하게 될 예정이다.

일반적으로 로그인을 하게 되면 로그인 창에서 메인 홈으로 이동하는 등 다른 창으로 넘어갈 것이다. 보통 홈으로 가니까 그 코드를 작성한다. 이것을 리다이렉트라 한다.

3. 중간 코드

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)
profile
.

0개의 댓글