본문 바로가기
Web/Django

[Web] ExcelCalculate with django for Mac - 3

by skwkiix 2023. 8. 1.
728x90
이 포스팅은 "Django 한그릇뚝딱"의 Chapter4 내용을 실습하며 정리한 내용이다.

 

인증코드 메일로 보내기


로직

join 함수 : 인증코드를 무작위로 생성 후 > 사용자에게 보냄
>  사용자에게 보낸 코드 == 사용자가 입력한 코드
일치하면 회원정보가입 성공

1. 인증 코드 생성

  • main > views.py
def join(request):
   print("테스트", request)
​
   name = request.POST['signupName'] 
   email = request.POST['signupEmail']
   pw = request.POST['signupPW']
   user = User(user_name = name,user_email=email, user_password=pw)
   user.save()
   print("사용자 정보 저장 완료됨")
​
   #인증코드 하나 생성
   code = randint(1000,2000)
   print("인증코드 생성",code)
   
   return redirect("main_verifyCode") 
  • 테스트
회원가입 후(/signup), 터미널 확인

 

2. 응답 객체 생성

  • main > views.py
def join(request):
   print("테스트", request)
​
   name = request.POST['signupName']  
   email = request.POST['signupEmail']
   pw = request.POST['signupPW']
   user = User(user_name = name,user_email=email, user_password=pw)
   user.save()
   print("사용자 정보 저장 완료됨")
​
   #인증코드 하나 생성
   code = randint(1000,2000)
   print("인증코드 생성",code)
   
   response = redirect("main_verifyCode")
   response.set_cookie('code', code)
   response.set_cookie('user_id',user.id)
   print('응답객체완성',response)
​
   return redirect("main_verifyCode") 
  • 테스트
회원가입 후(/signup), 터미널 확인

 

3. 인증코드를 이메일로 발송하기

1) 메일 포멧 만들기 - html 생성

  • sendEmail > templates > sendEmail > email_format.html
<!DOCTYPE html>
<html>
   <head>
       <meta charset="UTF-8">
   </head>
   <body>
       <h1>ExcelCalculate 회원 가입</h1>
       <p>다음의 인증 코드를 입력해 주세요</p>
       <h2> {{ verifyCode }} </h2>
   </body>

2) views.py 설정

send 함수 수정

  • sendEmail > views.py
from django.shortcuts import render
from django.http import HttpResponse
from django.core.mail import send_mail,EmailMessage
from django.template.loader import render_to_string
​
# Create your views here.
def send(receiverEmail, verifyCode):
   # main > join 함수 내부에서 사용이 될 것
   # receiverEmail : 사용자가 회원가입 떄 사용한 이메일 주소
   # verifyCode : 인증코드
   # 인증코드 발송은 에러가 날 가능성이 존재
   # try-except 구분문 사용Google 이용 <-- 개발자가 통제할 수 있는 영역이 아님
   try:
       content = {'verifyCode':verifyCode}
       msg_html = render_to_string("sendEmail/email_format.html", content)
       msg = EmailMessage(subject = "인증 코드 발송 메일",
                          body = msg_html,
                          from_email="skwkiix@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

3) settings.py 설정

구글의 SMTP 서버를 사용할 것이므로, 코드를 추가해준다.

  • ExcelCalculate > settings.py
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 = 'skwkiix@gmail.com'
EMAIL_HOST_PASSWORD = '보안키'

4) views.py 설정

send 함수를 join함수에서 호출

  • main > views.py
def join(request):
   print(request)
​
   name = request.POST['signupName']
   email = request.POST['signupEmail']
   pw = request.POST['signupPW']
   user = User(user_name = name, user_email = email, user_password = pw)
   user.save()
​
   # print("사용자 정보 저장 완료됨!! ")
​
   # 인증코드 하나 생성
   code = randint(1000, 9000)
   print("인증코드 생성-----------------", code) # 서버가 보낸 코드, 쿠키와 세션
   
   response = redirect("main_verifyCode") # 응답을 객체로 저장한다!
   response.set_cookie('code', code) # 인증코드
   response.set_cookie('user_id', user.id)
​
   print("응답 객체 완성----------------", response)
​
   # 이메일 발송 하는 함수 만들어보기
   # ExcelCalculate > main > views.py > join 함수 
   # 이메일 주소 2개를 준비를 해주세용
   send_result = send(email, code)
   if send_result:
       print("Main > views.py > 이메일 발송 중 완료된 거 같음....")
       return response
   else:
       return HttpResponse("이메일 발송 실패!")

메일 발송이 성공했다면 "이메일 발송 중 완료된 거 같음"

실패한다면 "이메일 발송 실패" 가 출력되도록 구현

  • 확인

터미널
이메일 발송 성공

 

4. 인증코드 입력 후 인증 완료한 유저로 설정

1) "인증하기" 버튼 클릭 시 verify 화면으로 이동

  • main > templates > verifyCode.html
<form action = "verify">
<div class="content">
           <div class="mainDiv">
               <h4>회원가입을 위해 입력하신 이메일로 인증코드를 보냈습니다.</h4>
               <h3>이메일로 전송된 메일의 인증코드를 입력해주세요.</h3><br>
               <form action="verify" method="POST">{% csrf_token %}
                   <div class="input-group">
                       <span class="input-group-addon" id="basic-addon1">인증코드</span>
                       <input name='verifyCode' type="text" class="form-control" placeholder="인증코드를 적어주세요." aria-describedby="basic-addon1">
                   </div><br>
                   <input type="submit" class="btn btn-success btn-lg" value="인증하기">
               </form>
           </div>
       </div>
 

2) views.py 설정

사영자가 입력한 코드값, 쿠키에 저장된 코드값 불러와서 비교하기

일치 시 user_validate 값을 1로 변경

  • main > views.py
def verify(request):
   # 사용자가 입력한 code 값을 받아야 함
   user_code = request.POST['verifyCode']
​
   # get으로 쿠키에 저장되어 있는 code 값을 가져온다(join함수 확인)
   cookie_code = request.COOKIES.get('code')
   print("코드 확인:",user_code, cookie_code)
​
   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)
​
       #사용자 정보를 세션에 저장
       request.session['user_name'] = user.user_name # 로그인 화면 구현
       request.session['user_email'] = user.user_email # 로그인 화면 구현
​
       return response
   else:
       return redirect('main_index')

3) 확인

인증코드 일치 시, User validate 가 체크되어있는지 확인

  • /verify 에서 인증코드 입력

/verify

 

  • /admin 으로 이동하여 생성한 관리자 계정으로 로그인 후 DB에 저장된 정보 확인

/admin/main/user/2/change/