본문 바로가기
웹 개발 실습/Django

[Django]_엑셀 계산 사이트 만들기 (3) 이메일 인증 회원가입 하기

by ssolLEE 2023. 8. 2.
반응형

이 프로젝트도 마찬가지로 책 'Django 한 그릇 뚝딱'의 Chapter 4을 보며 실행해보았습니다. 책의 저자님께 다시 한 번 감사말씀 드립니다.

 

지난 시간에 이어 진행하겠습니다. 

 

인증 코드 발송하기

 

로그인 과정이므로 main에서 인증하는 것을 만들어야 합니다. 그리고 이러한 로직 처리는 views.py에서 설정을 합니다.

인증코드 함수는 join함수로 진행합니다. 로직을 생각해볼까요? 

  • 인증 코드 는 무작위로 생성하여 사용자에게 보냄
  • 사용자에게 보낸(즉, 서버가 보낸) 인증 코드 == 사용자가 입력한 코드 : 가입 성공
  • 사용자에게 보낸(즉, 서버가 보낸) 인증 코드 != 사용자가 입력한 코드 : 계속 같은 화면 보여주기
  • 코드 보낼 때는 인증 코드, 이름, 이메일 , 기타 정보도 다 보내야 함.

 

  • 무작위 코드를 만들겠습니다.
  • ExcelCalculate > main > views.py 로 이동합니다. 3번째 줄 코드를 추가합니다. 

  • join 함수에 다음 코드를 추가합니다. 1000~9000 사이의 랜덤한 숫자를 code라는 변수에 저장하는 코드입니다.
    # 인증 코드 1000~9000 랜덤으로 하나 생성
    code = randint(1000, 9000)
    print("인증 코드 생성---------", code) ## 서버가 보낸 코드
  • terminal에 python manage.py runserver를 입력하여 웹 페이지를 띄웁니다. 그리고 주소에 /signup을 입력하여 웹 페이지를 이동합니다. 내용 입력 후, '회원 가입 하기' 버튼을 누르고 나서 terminal에 다음과 같은 문구가 뜨면 잘 하고 있는 것입니다. 

  • 위에 입력한 코드에 이어서 다음 코드를 입력합니다. 
    response = redirect("main_verifyCode") # 응답을 객체로 저장
    response.set_cookie('code', code) # 인증 코드
    response.set_cookie('user_id', user.id)
  • terminal에 python manage.py runserver를 입력하여 웹 페이지를 띄웁니다. 그리고 주소에 /signup을 입력하여 웹 페이지를 이동합니다. 내용 입력 후, '회원 가입 하기' 버튼을 누르고 나서 terminal에 다음과 같은 문구가 뜨면 잘 하고 있는 것입니다. 

잘 되고 있습니다.

 

이메일 발송하기

 

  • ExcelCalculate > sendEmail > templates > sendEmail > email_format.html 의 경로로 파일을 만듭니다.
  • 다음 코드를  email_format.html 에 붙여넣기 합니다.
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        <h1>ExcelCalculate 회원 가입</h1>
        <p>다음의 인증 코드를 입력해 주세요</p>

        <h2> verifyCode </h2>
    </body>
</html>
  • ExcelCalculate > sendEmail > views.py 로 이동하여 코드를 수정합니다.

  • 이어서 send 함수를 수정합니다. 이 send 함수는 main > join 함수 내부에서 사용이 될 것입니다. 그리고 receiverEmail은 사용자가 회원 가입할 때 입력한 이메일 주소, verifyCode는 인증 코드를 의미합니다.
# ExcelCalculate > sendEmail > views.py
def send(receiverEmail, verifyCode):
    try:
        content = {'verifyCode':verifyCode}
        msg_html = render_to_string('sendEmail/email_format.html', content)
        msg = EmailMessage(subject="[**회사]인증 코드 발송 메일", body=msg_html, 
                           from_email="datasoling@gmail.com", bcc=[receiverEmail])
        msg.content_subtype = "html"
        msg.send()

        print("sendEmail > views.py > send함수 임무 완료-------")
        return True
    
    except:
        print("sendEmail > views.py > send함수 임무 실패.......")
        return False
  • try-except 구문은 예외처리 구문입니다. 예외 처리는 프로그램이 강제 종료가 되는 것을 막아주는 역할이라고 할 수 있는데, 우리의 상황에 적용해서 설명하면 다음과 같습니다. 인증 코드를 발송할 때 에러가 날 가능성은 있습니다. 우리는 구글을 이용하기 때문에 개발자가 모든 걸 다 통제할 수는 없습니다. 따라서 외부 API를 사용할 때에는 꼭 예외처리를 포함시켜야 합니다. 중간에 에러가 나더라도 우선 코드는 끝까지 돌아가야 하는 것이 우리의 목표 입니다. 

 

  • Excelcalculate > Excelcalculate > settings.py 로 이동하여 다음의 내용을 입력합니다. 여기서 EMAIL_HOST_USER는 자신의 gmail, EMAIL_HOST_PASSWORD는 구글에서의 앱 비밀번호입니다.
ALLOWED_HOSTS = []

# Email Settings
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST_USER = 'XXXX@gmail.com'
EMAIL_HOST_PASSWORD = 'XXXXXXXXXXXXXXXX'

 

  • 이제 join 함수에서 send 함수를 호출하도록 하겠습니다.   
  • ExcelCalculate > main > views.py 로 이동합니다. 4번째 줄을 추가하고 join 함수 맨 아래쪽(return 위)에 코드를 추가합니다.

 

# 이메일 발송 함수 호출
	send_result = send(email, code)
    if send_result:
        print("main > views.py > 이메일 발송 완료")
        return response
    else:
        return HttpResponse("이메일 발송 실패")
    
    #return response
  • 웹 페이지로 가서 직접 회원 가입을 하고 인증 코드도 확인해 보세요.
  • 메일 잘 받으셨나요? 인증코드가 조금 수상하지요? 그건 이렇게 하면 됩니다.
  • ExcelCalculate > sendEmail > templates > sendEmail > email_format.html 로 이동하여 다음과 같이 수정합니다.
  • 다시 회원 가입합니다.

인증 코드 설정 전과 후

 

인증 코드 일치 여부 확인하기

 

이제 우리는 user가 입력한 코드 값을 받아야 하고 / join함수로 쿠키에 저장되어 있는 코드 값을 가져 옵니다.

이  둘이 같아야 회원으로서 인증할 수 있습니다. 

  • ExcelCalculate > main > templates > main > verifyCode.html 로 이동하여 <form> 태그의 action 값을 입력합니다.

  • ExcelCalculate > main > views.py 로 이동합니다. verify함수를 수정합니다. 
  • user가 입력한 코드 값과 쿠키에 저장된 코드 값을 불러옵니다.
def verify(request):  
    # user가 입력한 code값을 받아야 함
    user_code = request.POST['verifyCode']
    # 쿠키에 저장된 코드를 불러옴(join함수 확인)
    cookie_code = request.COOKIES.get('code')
    print("코드 확인: ", user_code, cookie_code)
  • user가 입력한 코드 값과 쿠키에 저장된 코드 값이 같으면 user_validate =1, 다르면 인증 코드 입력 화면을 다시 보여주는 것으로 로직을 설계합니다. 간단히 로직만 말로 써보면 다음과 같겠습니다.
if 두 코드가 같으면:
	print("True")
    회원 가입 환료
    
else:
	print("False")
    return redirect('main_verifyCode') #verifyCode 화면으로 돌리기
  • 위에 쓴 말을 코드로 구현해볼까요?
    if user_code == cookie_code:
        user=User.objects.get(id=request.COOKIES.get('user_id'))
        user.user_validate = 1 # True 1, False 0
        user.save()

        print("DB에 user_validate 업데이트-------")

        response = redirect('main_index')

        # 저장되어 있는 쿠키를 삭제
        response.delete_cookie('code')
        response.delete_cookie('user_id')
        response.set_cookie('user', user)
        return response
  • 위의 코드를 보면, user의 코드와 쿠키의 코드가 일치할 경우에는 user_validate 값을 1로 변경시킵니다. 값을 변경하려는 user를 찾으려고 쿠키에 저장해놓은 user_id를 이용해, get 함수를 통해 user를 가져옵니다. user_validate 값을 1로 변경시켜 준 후,  해당 변경 사항을 save했습니다. 그리고 한 번 더 쿠키값을 세팅하기 위해 redirect 함수에 메인 화면을 넘겨 준 결과 값은 response로 받아오고, 이전에 설정한 2개의 쿠키값은 삭제, 로그인된 user의 정보를 쿠키로 설정하여 response를 반환시킵니다. 또한 두 값이 일치하지 않으면 인증 코드 입력 화면으로 redirect시켜줍니다.
  • 이제 terminal에 다음 명령어를 입력하여 DB 내용을 지운 후에 회원 가입 과정을 다시 합니다. 계속 같은 이메일을 사용하면 에러가 발생하기 때문입니다. 해당하지 않는 경우에는 생략해도 되는 과정입니다.
rm -rf db.sqlite3
python manage.py makemigrations
python manage.py migrate
  • superuser로 ~/admin에 로그인을 합니다..(superuser 명령어: python manage.py createsuperuser)
  • 회원가입 절차를 인증 코드 입력까지 진행합니다.
  •  ~/admin에서 다음과 같이 User validate에 체크가 되어 있다면 진행이 잘 되고 있다는 것입니다

지금까지 정말 수고 많으셨습니다.

 

다음 시간에는 로그아웃 기능을 구현하겠습니다.

감사합니다.