使用电子邮件注册,Django 2.0
Posted
技术标签:
【中文标题】使用电子邮件注册,Django 2.0【英文标题】:Registration using e-mail, Django 2.0 【发布时间】:2018-05-28 11:24:49 【问题描述】:我只是一个初学者,所以在制作我的第一个项目时遇到了一些问题。我在视图中有代码:
def signup(request):
if request.method == 'POST':
form = SignupForm(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 = 'Активация'
message = render_to_string('acc_active_email.html',
'user': user,
'domain': current_site.domain,
'uid':urlsafe_base64_encode(force_bytes(user.pk)),
'token':account_activation_token.make_token(user),
)
print(message) # здесь я смотрю какое сообщение отправляю
to_email = form.cleaned_data.get('email')
email = EmailMessage(
mail_subject, message, to=[to_email]
)
email.send()
return HttpResponse('Пожалуйста, подтвердите адрес электронной почты')
else:
form = SignupForm()
return render(request, '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.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 redirect('home')
return HttpResponse('Thank you for your email confirmation. Now you can login your account.')
else:
return HttpResponse('Activation link is invalid!')
此代码来自网址:
from . import views
from django.urls import path
urlpatterns = [
path('', views.signup, name='signup'),
path('activate/?P<uidb64>[0-9A-Za-z_\-]+/(?P<token>[0-9A-Za-z]1,13-[0-9A-Za-z]1,20)/$',
views.activate, name='activate'),
]
问题是我总是在我的电子邮件中收到无效的 URL。 我认为这是关于新的“路径”功能,可以使用的是
<int:uidb64>
但不确定。 感谢您的帮助!
【问题讨论】:
【参考方案1】:当你使用path()
时,你不能使用像[0-9A-Za-z_\-]+
这样的正则表达式。如果您想使用正则表达式,请使用 re_path
(与旧版本 Django 中的 url()
相同)。
当您使用path()
时,您可以使用内置path converters 之一。不能使用<int:uidb64>
,因为uidb 可以包含A-Za-z
、连字符和下划线,而不仅仅是数字。
对于您的uidb64
和token
,我认为slug
是Django 中包含的最合适的路径转换器。
path('activate/<slug:uidb64>/<slug:token>/', views.activate, name='activate'),
这将匹配您的正则表达式不允许的 slug 和标记,但这不是问题,只要您的 check_token
方法为这些无效值返回 False
并且不会引发错误。
【讨论】:
感谢您的回复,但现在我在 /signup/ 获得 NoReverseMatch。能否请教一下如何解决这个问题? 也许这是关于我的 html 文件:% autoescape off % Здравствуйте user.username , Пожалуйста нажмите на ссылку, чтобы активировать аккаунт: http:// domain % url 'activate'% url 'activate' uidb64=uid token=token %
。或者您可以使用位置参数:% url 'activate' uid token %
.
“激活”仍然出错。找不到带有参数“(b'NjI','4rz-742abd4c7bd36c6edcd0')'的'激活'的反向。使用您的两种变体,对我来说更加清楚,但我仍然不明白为什么它不起作用。我是否理解“激活”应该只是该 URL 中的一个词?
您使用'activate'
是因为您试图用name='activate'
反转模式。问题是b'Njl'
是字节。看到这个问题:***.com/questions/47177696/…。如果您仍然卡住,请提出一个新问题,因为这是一个单独的问题。以上是关于使用电子邮件注册,Django 2.0的主要内容,如果未能解决你的问题,请参考以下文章
Django allauth 社交登录:使用注册的电子邮件自动链接社交网站配置文件