Письмо активации учетной записи пользователя - протокол повторяется дважды (django)
В этом сценарии я хочу, чтобы пользователь получил электронное письмо для активации своего аккаунта.
В этом письме будет содержаться ссылка, на которую нужно будет перейти для получения ссылки активации.
По какой-то причине протокол "https://" повторяется в письме дважды.
В этом случае код отображает: "https://https://sitename.com/...
"
Однако я не сталкиваюсь с этой проблемой, когда запускаю код на своем локальном хосте.
Я использую Django и развертываю на Heroku (на всякий случай, если это имеет значение).
Вот код.
Я попробовал переписать представления, в которых обрабатывается протокол:
"protocol": 'https' if request.is_secure() else 'http'
#to
"protocol": '' if request.is_secure() else 'http
'
но безуспешно, протокол по-прежнему повторяется дважды.
Шаблон
{% autoescape off %}
Hi,
Please click on the link below to confirm your registration:
{{ protocol }}://{{ domain }}{% url 'activate' uidb64=uid token=token %}
{% endautoescape %}
просмотров
def activate(request, uidb64, token):
User = get_user_model()
try:
uid = force_str(urlsafe_base64_decode(uidb64))
user = User.objects.get(pk=uid)
except:
user = None
if user is not None and account_activation_token.check_token(user, token):
user.is_active = True
user.save()
messages.success(request, "Thank you for your email confirmation. Now you can log in your account.")
return redirect('home')
else:
messages.error(request,"Activation link is invalid")
return redirect('home')
def activateEmail(request, user, to_email):
mail_subject = "Activate your user account"
message = render_to_string("main/template_activate_account.html", {
'user': user.username,
'domain': get_current_site(request).domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
"protocol": 'https' if request.is_secure() else 'http'
})
email = EmailMessage(mail_subject, message, to=[to_email])
if email.send():
messages.success(request,f'Dear <b>(new_user)</b>, please go to your email<b>(to_email)</b> inbox and click on \ recieved activation link to confirm and complete the registration. <b>Note:</b>Check your spam folder.')
else:
messages.error(request, f'Problem sending email to {to_email}, check if you typed it correctly.')
def register_user(request):
if request.method == "POST":
form = RegisterForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active=False
user.save()
user = authenticate(username = form.cleaned_data['username'],
password = form.cleaned_data['password1'],)
login(request,user)
activateEmail(request, user, form.cleaned_data.get('email'))
return redirect('home')
else:
for error in list(form.errors.values()):
messages.error(request, error)
else:
form = RegisterForm()
return render(request,'main/registration/register_user.html',{'form':form})
settings
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_FROM = 'XX'
EMAIL_HOST_USER = 'XX'
EMAIL_HOST_PASSWORD = 'XX'
EMAIL_PORT = 587
EMAIL_USE_TLS= True
PASSWORD_RESET_TIMEOUT = 14400
tokens.py
from django.contrib.auth.tokens import PasswordResetTokenGenerator
import six
class AccountActivationTokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
return(
six.text_type(user.pk)+ six.text_type(timestamp) + six.text_type(user.is_active)
)
account_activation_token=AccountActivationTokenGenerator()