【发布时间】:2021-04-28 00:16:12
【问题描述】:
好吧,我决定通过向刚刚注册的用户的电子邮件发送激活链接来实现帐户认证系统,这是发送的视图和消息
def register(request):
if request.method == 'POST':
form = UserRegisterForm(request.POST)
if form.is_valid():
user = form.save(commit=False)
user.is_active = False
user.save()
current_site = get_current_site(request)
mail_subject = 'Activate your blog account.'
message = render_to_string(
'users/email_template.html',
{
'user': user,
'domain': current_site.domain,
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
}
)
to_email = form.cleaned_data.get('email')
email = EmailMessage(mail_subject, message, to=[to_email])
email.send()
return HttpResponse('Please confirm your email address to complete the registration')
else:
form = UserRegisterForm()
return render(request, 'users/register.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.DoesNotExist):
user = None
if user is not None and account_activation_token.check_token(user, token):
user.is_active = True
user.save()
login(request, user)
return HttpResponse('Thank you for your email confirmation. Now you can login account.')
else:
return HttpResponse('Activation link is invalid!')
令牌生成器类:
from django.contrib.auth.tokens import PasswordResetTokenGenerator
from six import text_type
class TokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
return (
text_type(user.pk) + text_type(timestamp) +
text_type(user.is_active)
)
account_activation_token = TokenGenerator()
带有消息的模板:
{% autoescape off %}
Hi {{ user.username }},
Please click on the link to confirm your registration
http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
{% endautoescape %}
url.py:
urlpatterns = [
path('register/', views.register, name='register'),
path('activate/<uidb64>/<token>/', views.activate, name='activate'),
path('login/', auth_views.LoginView.as_view(template_name='users/login.html'), name='login'),
path('logout/', auth_views.LogoutView.as_view(template_name='users/logout.html'), name='logout'),
path("profile/<str:username>/", views.profile, name="profile"),
]
一切正常,但激活链接有问题,如下所示:http://localhost:8000//users/activate/MTY/agxxit-58f6e97c157ac2855dd80794f2ce9c62/端口 8000 之后的两个栏,这是生成错误,要工作我需要在浏览器栏中编辑链接,删除其中一个栏。有谁知道如何组织此链接,使其不会出现在端口 8000 之后的两个条中?
【问题讨论】:
-
嘿,你的 urls.py 配置是什么样的?想知道你是否可能有一个额外的斜线。
-
我忘记发布 url 配置了。稍等一下,我来编辑
-
@Joaquim,对您有帮助吗?你的问题解决了吗?