使用电子邮件注册,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 之一。不能使用&lt;int:uidb64&gt;,因为uidb 可以包含A-Za-z、连字符和下划线,而不仅仅是数字。

对于您的uidb64token,我认为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' =uid =token % % endautoescape % 你没有在 url 标签中使用路径转换器语法,只是变量名:% 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 实现网站注册用户邮箱验证功能

向注册到 django 应用程序的用户发送电子邮件

使用gmail和Django注册不会重置密码电子邮件

Django allauth 社交登录:使用注册的电子邮件自动链接社交网站配置文件

如何通过电子邮件强制执行 Django 用户注册单步(而不是两步)过程?

Django rest-auth allauth 注册,带有电子邮件、名字和姓氏,没有用户名