Django 用户注册及邮件确认

Django 用户注册及邮件确认

通常情况下,我们在任何网站注册时,都会接收到确认链接来激活账户。有时,网站也会要求通过电子邮件来更改邮箱或重置密码。

在本教程中,我们将学习如何在Django中发送确认邮件,当有人在我们的网站应用上注册时。我们将讨论一种简单的方法来实现这个功能。但是Django还提供了其他很多选择,比如django-allauth应用程序、django-registration、django-registration-redux。这些应用程序使这个任务变得非常简单直接。

在开始之前,请确保你具备Django和Python编程语言的基础知识。创建Django的基本设置并配置好环境。

配置设置

首先,我们需要在settings.py中配置邮件主机服务器以发送确认邮件。在 settings.py 文件中添加以下配置代码:

EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'youremail@gmail.com'
EMAIL_HOST_PASSWORD = 'yourpassword'
EMAIL_PORT = 587

我们使用了电子邮件ID以及密码和Gmail SMTP主机服务器。您也可以使用其他SMTP服务器。

生成令牌

我们需要创建一个令牌,该令牌将用于电子邮件确认URL中。在令牌文件夹中创建token.py文件,并添加以下代码。

from django.contrib.auth.tokens import PasswordResetTokenGenerator
from django.utils import six
class TokenGenerator(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 = TokenGenerator()

我们使用了 PasswordTokenGenerator 类来重置密码。在上述代码中,我们为确认生成了唯一的令牌。

创建注册表单

Django提供了内置的 UserCreationForm 类,这是一个非常好用的类用来创建表单。我们在应用程序中创建了forms.py文件,并导入UserCreationForm类。让我们来理解一下下面的代码。

forms.py

from django import forms
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User

class SignupForm(UserCreationForm):
    email = forms.EmailField(max_length=200, help_text='Required')
    class Meta:
        model = User
        fields = ('username', 'email', 'password1', 'password2')

在上面的代码中,我们导入了UserCreationForm和内置的用户(User)。然后我们创建了一个 SignupForm ,其中包含了额外的字段email在 SignupForm 中。

view.py

from django.http import HttpResponse
from django.shortcuts import render, redirect
from django.contrib.auth import login, authenticate
from .forms import SignupForm
from django.contrib.sites.shortcuts import get_current_site
from django.utils.encoding import force_bytes, force_text
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.template.loader import render_to_string
from .tokens import account_activation_token
from django.contrib.auth.models import User
from django.core.mail import EmailMessage

def signup(request):
    if request.method == 'POST':
        form = SignupForm(request.POST)
        if form.is_valid():
            # save form in the memory not in database
            user = form.save(commit=False)
            user.is_active = False
            user.save()
            # to get the domain of the current site
            current_site = get_current_site(request)
            mail_subject = 'Activation link has been sent to your email id'
            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),
            })
            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 = SignupForm()
    return render(request, 'signup.html', {'form': form})

在这里,我们创建了一个注册视图,它使用POST方法获取信息并进行验证。我们使用了commit = False,因为它允许我们获取模型对象并添加一些额外的属性。在这里,我们做了 user.is_active = False ,这意味着用户在电子邮件验证之前无法登录。

然后我们使用 EmailMessage() 函数发送包括主题和消息的邮件。邮件消息由模板创建。

templates/acc_active_email.html

{% autoescape off %}
Hi {{ user.username }},
Please click on the link to confirm your registration,
http://{{ domain }}{% url 'activate' uidb64=uid token=token %}
{% endautoescape %}

此模板创建一个带有激活链接的电子邮件正文,将用于申请发送。

现在我们需要为激活链接创建一个视图。

创建激活视图

一旦用户点击激活链接,我们需要通过激活链接来激活他们的帐户。此过程由 activate 视图处理。

views.py

def activate(request, uidb64, token):
    User = get_user_model()
    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()
        return HttpResponse('Thank you for your email confirmation. Now you can login your account.')
    else:
        return HttpResponse('Activation link is invalid!')

我们在注册功能之后添加了激活功能。此视图将检查令牌是否有效,然后用户将激活并登录。我们设置了 user.is_active = True ,这意味着用户可以登录。

现在我们将把视图映射到URL。

URLS

from django.urls import path
from .views import home, index, activate
urlpatterns = [
    path('', home, name = 'home'),
    path('form/', index, name = 'index'),
    path('activate/(?P[0-9A-Za-z_\-]+)/(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})/',
        activate, name='activate'),
]

在 template/signup.html 中创建一个注册表单。

{% extends 'base.html' %}

{% block content %}
<div class = "container">
  <h2>Sign up</h2>
  <form method="post">
    {% csrf_token %}
      {% for field in form %}
      <p>
        {{ field.label_tag }}<br>
        {{ field }}
        {% if field.help_text %}
          <small style="display: none ">{{ field.help_text }}</small>
        {% endif %}
        {% for error in field.errors %}
          <p style="color: red">{{ error }}</p>
        {% endfor %}
      </p>
      {% endfor %}
    <button type="submit">Sign up</button>
  </form>
</div>
{% endblock %}

表单如下所示。当用户单击提交按钮时,激活链接将发送到他们输入的电子邮件地址。

Django 用户注册及邮件确认

当您点击注册按钮时,确认邮件将发送到提供的电子邮件地址。

Django 用户注册及邮件确认

点击收到的链接,现在您已经准备好登陆了。

注意-确保打开了不安全应用程序访问设置。否则,您将面临smtp错误。

Django 用户注册及邮件确认

Tada,我们已经成功地创建了基于电子邮件配置的用户注册。这个过程很简单,并且需要较少的代码来完成。您可以通过添加更多功能(如吸引人的模板,重定向到登录等)来进一步改进它。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程