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 에서 인증코드 입력
- /admin 으로 이동하여 생성한 관리자 계정으로 로그인 후 DB에 저장된 정보 확인
'Web > Django' 카테고리의 다른 글
[Web] ExcelCalculate with django for Mac - 5 (0) | 2023.08.02 |
---|---|
[Web]ExcelCalculator with django for Mac - 4 (0) | 2023.08.02 |
[Web] ExcelCalculate with django for Mac - 2 (0) | 2023.07.31 |
[Web] ExcelCalculate with django for Mac - 1 (0) | 2023.07.31 |
[Web] django로 Todolist 만들기 for Mac - 4 (0) | 2023.07.28 |