장고
장고 이메일 인증 SMTP
작지
2021. 9. 15. 21:07
다른 이메일 플랫폼을 통해 Gmail 확인하기 - Gmail 고객센터
도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요
support.google.com
보안 수준이 낮은 앱 및 Google 계정 - Google 계정 고객센터
도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요
support.google.com
github :https://github.com/wkdtpzld/again/tree/40101b7873d8e37916823b79ec7c159e1a464896
settings.py에 추가하세요
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_PORT = '587'
EMAIL_HOST_USER = 'id@gmail.com'
EMAIL_HOST_PASSWORD = 'pw'
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
id=자기 구글 이메일, pw 비번 입력해주시면 됩니다.
내가 만든 로그인은 Django의 UserCreationForm을 기초로 만든 근본도없는 모델이다.
from django.shortcuts import render , redirect
from common.forms import UserForm
from django.contrib.auth import authenticate, login
def signup(request):
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password) # 사용자 인증
login(request, user) # 로그인
return redirect('index')
else:
form = UserForm()
return render(request, 'common/signup.html',{'form':form})
기존 common/views
from django.shortcuts import render , redirect
from common.forms import UserForm
from django.contrib.auth import authenticate
from django.contrib.sites.shortcuts import get_current_site
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes , force_text
from .tokens import account_activation_token
from django.contrib import auth
from django.contrib.auth.models import User
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
def signup(request):
if request.method == 'POST':
form = UserForm(request.POST)
if form.is_valid():
form.save()
username = form.cleaned_data.get('username')
raw_password = form.cleaned_data.get('password1')
user = authenticate(username=username, password=raw_password) # 사용자 인증
user.is_active=False # 비활성화
user.save()
current_site = get_current_site(request)
message = render_to_string('common/activation_email.html',{
'user':user,
'domain':current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
mail_title = "계정 활성화 확인 이메일"
mail_to = request.POST['email']
email = EmailMessage(mail_title, message, to=[mail_to])
email.send()
# login(request, user) # 로그인 (비 활성화 시켰기 때문에 주석처리함)
return redirect('index')
else:
form = UserForm()
return render(request, 'common/signup.html',{'form':form})
def activate(request, uidb64, token):
try:
uid = force_text(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except(TypeError, ValueError, OverflowError, User.DoesNotExsit):
user = None
if user is not None and account_activation_token.check_token(user, token):
user.is_active = True
user.save()
auth.login(request, user)
return redirect('index')
else:
return render(request, 'index',{'error':'nope'}) #( 'error'는 형식상 존재 )
수정 후
activate는 수정이 필요
후에 방법을 찾으면 링크 첨부
tokens.py
from django.contrib.auth.tokens import PasswordResetTokenGenerator
class AccountActivationTokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
return (str(user.pk) + str(timestamp)) + str(user.is_active)
account_activation_token = AccountActivationTokenGenerator()
login과 logout은 auth_views.LoginView.as_view(templates)사용중이다.
urls에 activate를 추가
urlpatterns = [
path('login/',auth_views.LoginView.as_view(template_name='common/login.html'), name='login'),
path('logout/',auth_views.LogoutView.as_view(),name='logout'),
path('signup/', views.signup, name='signup'),
path('activate/<str:uidb64>/<str:token>/', views.activate, name='activate')
]
또한 인증메일인 activate.html 작성
{{user.username}}님, 아래 링크를 클릭하여 계정을 활성화하세요:
http://{{domain}}{% url 'common:activate' uid token %}
진짜 간단하게 날라간다