반응형
이 프로젝트도 마찬가지로 책 '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에 체크가 되어 있다면 진행이 잘 되고 있다는 것입니다.
지금까지 정말 수고 많으셨습니다.
다음 시간에는 로그아웃 기능을 구현하겠습니다.
감사합니다.
'웹 개발 실습 > Django' 카테고리의 다른 글
[Django]_엑셀 계산 사이트 만들기 (5) 파일 업로드 및 분석 (0) | 2023.08.02 |
---|---|
[Django]_엑셀 계산 사이트 만들기 (4) 로그인 여부 확인, 로그아웃 (0) | 2023.08.02 |
[Django]_엑셀 계산 사이트 만들기 (2) 회원가입 하기 (0) | 2023.08.02 |
[Django]_엑셀 계산 사이트 만들기 (1) app의 웹 사이트, admin 화면 만들기 (0) | 2023.08.01 |
[Django]_맛집 공유 사이트 만들기 (3) 이메일 보내기 (0) | 2023.07.31 |