Я пытаюсь создать проверку электронной почты для регистрации пользователя с помощью CreateView
. Эта проверка просмотра является ли пользователь новым или уже существующим неактивным пользователем? и повторно отправить подтверждение, если пользователь неактивен.
Вот как я это сделал (часть отправки электронной почты),
views.py
class SignUpView(CreateView):
""" SignUp view """
form_class = SignUpForm
success_url = reverse_lazy('login')
template_name="registration/register.html"
def send_activation_email(self, request, user):
""" sends email confirmation email """
uidb64 = urlsafe_base64_encode(force_bytes(user.pk))
token = token_generator.make_token(user)
domain = get_current_site(request).domain
schema = request.is_secure() and "https" or "http"
link = reverse('user_activation', kwargs={'uidb64': uidb64, 'token': token})
url="{}://{}{}".format(schema, domain, link)
payload = {
'receiver': user.email,
'email_body': {
'username': user.username,
'email_body': 'Verify your email to finish signing up for RapidReady',
'link': url,
'link_text': 'Verify Your Email',
'email_reason': "You're receiving this email because you signed up in {}".format(domain),
'site_name': domain
},
'email_subject': 'Verify your Email',
}
Util.send_email(payload)
messages.success(request, 'Please Confirm your email to complete registration.')
def get(self, request, *args, **kwargs):
""" Prevents authenticated user accessing registration path """
if request.user.is_authenticated:
return redirect('home')
return super(SignUpView, self).get(request, *args, **kwargs)
def form_valid(self, form):
""" Handles valid form """
form = self.form_class(self.request.POST)
user = form.save(commit=False)
user.is_active = False
user.save()
self.send_activation_email(self.request, user)
return render(self.request, 'registration/confirm_email.html', {'email': user.email})
def post(self, request, *args, **kwargs):
""" Handles existing inactive user registration attempt """
form = self.form_class(self.request.POST)
if User.objects.filter(email=request.POST['email']).exists():
user = User.objects.get(email=request.POST['email'])
if not user.is_active:
self.send_activation_email(request, user)
return render(self.request, 'registration/confirm_email.html', {'email': user.email})
# if no record found pass to form_valid
return self.form_valid(form)
util.py
class TokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
return text_type(user.is_active) + text_type(user.pk) + text_type(timestamp)
token_generator = TokenGenerator()
class EmailThread(threading.Thread):
def __init__(self, email):
self.email = email
threading.Thread.__init__(self)
def run(self):
self.email.send()
class Util:
@staticmethod
def send_email(data):
msg_plain = render_to_string('email/email_normal_email.txt', data['email_body'])
msg_html = render_to_string('email/email_normal_email.html', data['email_body'])
msg = EmailMultiAlternatives(data['email_subject'], msg_plain, config('EMAIL_HOST_USER'), [data['receiver']])
msg.attach_alternative(msg_html, "text/html")
EmailThread(msg).start()
В приведенном выше коде я использовал form_valid()
метод обработки регистрация нового пользователя и post()
метод, чтобы проверить, является ли пользователь новый или уже зарегистрированный неактивный пользователь.
Если запись не найдена, post()
метод вызовет form_valid()
метод, передающий форму в качестве аргумента (последняя строка в представлениях). И эта логика прекрасно работает.
Итак, мой главный вопрос: есть ли какие-либо негативные эффекты из-за этой реализации? Будем очень признательны за любые советы (передовой опыт, улучшения и т. д.).