Django项目 | 实现登录注册验证电子邮箱

ops/2024/11/24 1:34:26/

在实现登录验证电子邮箱时,需要确保模型中包含电子邮箱字段

自定义用户模型登录验证电子邮箱实现

1. 模型(Model)

确保自定义用户模型中包含电子邮箱字段。例如:

from django.contrib.auth.models import AbstractUser
from django.db import modelsclass CustomUser(AbstractUser):email = models.EmailField(unique=True)# 其他自定义字段...

2. 表单(Form)

创建或修改用户登录表单,以包含电子邮箱字段。

from django import forms
from django.contrib.auth import get_user_modelUser = get_user_model()class EmailAuthenticationForm(forms.Form):email = forms.EmailField(label="Email", max_length=254, widget=forms.EmailInput(attrs={'autofocus': True}))password = forms.CharField(label="Password", widget=forms.PasswordInput)def clean(self):cleaned_data = super().clean()email = cleaned_data.get('email')password = cleaned_data.get('password')if email and password:if not User.objects.filter(email=email).exists():raise forms.ValidationError("Email is not registered")user = authenticate(username=email, password=password)if not user:raise forms.ValidationError("Invalid email or password")

3. 视图(View)

在登录视图中添加逻辑来验证电子邮箱。

from django.contrib.auth import authenticate, login
from django.shortcuts import render, redirect
from .forms import EmailAuthenticationFormdef user_login(request):if request.method == 'POST':form = EmailAuthenticationForm(request.POST)if form.is_valid():email = form.cleaned_data.get('email')password = form.cleaned_data.get('password')user = authenticate(request, email=email, password=password)if user is not None:login(request, user)return redirect('home')else:form.add_error(None, "Invalid email or password.")else:form = EmailAuthenticationForm()return render(request, 'users/login.html', {'form': form})

4. 模板(Template)

在登录页面模板中添加电子邮箱输入字段。

<!-- users/login.html -->
<form method="post">{% csrf_token %}{{ form.email.errors }}<label for="email">Email:</label><input type="email" name="email" required id="email">{{ form.password.errors }}<label for="password">Password:</label><input type="password" name="password" required id="password"><button type="submit">Login</button>
</form>

5. 信号(Signal)

使用Django的信号在用户注册后发送验证邮件。

from django.db.models.signals import post_save
from django.dispatch import receiver
from django.core.mail import send_mail
from django.conf import settings@receiver(post_save, sender=User)
def send_verification_email(sender, instance, created, **kwargs):if created:subject = 'Verify your email'message = f'Hello {instance.email}, Please click on the link to verify your email.'link = f'http://{settings.SITE_DOMAIN}verify/{instance.id}/{instance.email_token}/'send_mail(subject, message + link, settings.EMAIL_HOST_USER, [instance.email], fail_silently=False)

6. URLs

配置URL以处理验证链接的请求。

# urls.py
from django.urls import path
from . import viewsurlpatterns = [path('login/', views.user_login, name='login'),path('verify/<int:user_id>/<str:token>/', views.verify_email, name='verify_email'),
]

确保您的项目配置了邮件发送相关的设置,如EMAIL_BACKEND, EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD等。在项目的settings.py文件中添加或修改以下配置项。以下是具体的配置示例:

# settings.py# 邮件后端设置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'# SMTP 服务器设置
EMAIL_HOST = 'smtp.yourmailserver.com'  # SMTP 服务器地址
EMAIL_PORT = 587  # SMTP 服务器端口(通常是587或465)
EMAIL_USE_TLS = True  # 是否使用TLS(对于大多数SMTP服务器是必需的)
# 或者使用SSL
# EMAIL_USE_SSL = True
# EMAIL_PORT = 465  # 如果使用SSL,端口通常是465# 发件人设置
EMAIL_HOST_USER = 'your-email@example.com'  # 发件人邮箱地址
EMAIL_HOST_PASSWORD = 'your-email-password'  # 发件人邮箱密码或应用专用密码# 可选设置
EMAIL_SUBJECT_PREFIX = '[YourProject] '  # 发送邮件的主题前缀
EMAIL_FROM_ADDRESS = 'webmaster@yourdomain.com'  # 默认发件人地址
EMAIL_TIMEOUT = 10  # 发送邮件的超时时间(秒)

请根据您的邮件服务提供商和个人账户信息,替换上述配置中的占位符(如yourmailserver.comyour-email@example.comyour-email-password)。

常见邮件服务提供商的SMTP设置:

  • Gmail:

    • EMAIL_HOST = 'smtp.gmail.com'
    • EMAIL_PORT = 587(使用TLS)
    • EMAIL_USE_TLS = True
    • EMAIL_HOST_USER = 'your-email@gmail.com'
    • EMAIL_HOST_PASSWORD = 'your-gmail-password'(或者使用应用专用密码)
  • Outlook.com:

    • EMAIL_HOST = 'smtp-mail.outlook.com'
    • EMAIL_PORT = 587(使用TLS)
    • EMAIL_USE_TLS = True
    • EMAIL_HOST_USER = 'your-email@outlook.com'
    • EMAIL_HOST_PASSWORD = 'your-outlook-password'
  • Yahoo Mail:

    • EMAIL_HOST = 'smtp.mail.yahoo.com'
    • EMAIL_PORT = 465(使用SSL)
    • EMAIL_USE_SSL = True
    • EMAIL_HOST_USER = 'your-email@yahoo.com'
    • EMAIL_HOST_PASSWORD = 'your-yahoo-password'

确保您的邮箱账户允许通过SMTP发送邮件,并且您已经正确设置了应用专用密码(如果使用两步验证的话)。这些设置将使您的Django项目能够发送邮件,例如在用户注册时发送验证邮件。


http://www.ppmy.cn/ops/136187.html

相关文章

创建可重用React组件的实用指南

尽管React是全球最受欢迎和使用最广泛的前端框架之一&#xff0c;但许多开发者在重构代码以提高可复用性时仍然感到困难。如果你发现自己在React应用中不断重复相同的代码片段&#xff0c;那你来对地方了。 在本教程中&#xff0c;将向你介绍三个最常见的特征&#xff0c;表明是…

VSCode自定义插件创建教程

文章目录 一、前言二、插件维护三、调试插件四、使用 vsce 生成 vsix 插件五、问题汇总5.1 打开调试窗口后&#xff0c;输入helloworld并没有指令提示5.2 插件调试无问题&#xff0c;打包生成 .vsix 文件后无法使用 六、插件创建实战七、拓展阅读 一、前言 对于前端程序猿来讲…

RNN简单理解;为什么出现Transformer:传统RNN的问题;Attention(注意力机制)和Self-Attention(自注意力机制)区别;

目录 RNN简单理解 RNN n to n Transformer N to M LSTM 为什么出现Transformer:传统RNN的问题 信息丢失的后果 Rnn是顺序执行的效率不高:顺序执行 Attention(注意力机制)和Self-Attention(自注意力机制)区别 一、计算对象不同 二、应用场景不同 三、功能差异…

OceanBase 中常用的查询语句

本文汇总整理了一些 OceanBase 中的常用查询语句&#xff0c;包括租户创建、转储与合并、表相关等场景&#xff0c;希望帮大家解决日常运维操作中的常见的问题。 租户类 OceanBase支持多租户架构&#xff0c;其中默认存在一个名为sys的租户。为了满足业务使用需求&#xff0c;…

uni-app 修改复选框checkbox选中后背景和字体颜色

编写css&#xff08;注意&#xff1a;这个样式必须写在App.vue里&#xff09; /* 复选框 */ /* 复选框-圆角 */ checkbox.checkbox-round .wx-checkbox-input, checkbox.checkbox-round .uni-checkbox-input {border-radius: 100rpx; } /* 复选框-背景颜色 */ checkbox.checkb…

STM32完全学习——系统时钟设置

一、时钟框图的解读 首先我们知道STM32在上电初始化之后使用的是内部的HSI未经过分频直接通过SW供给给系统时钟&#xff0c;由于内部HSI存在较大的误差&#xff0c;因此我们在系统完成上电初始化&#xff0c;之后需要将STM32的时钟切换到外部HSE作为系统时钟&#xff0c;那么我…

NVR管理平台EasyNVR多个NVR同时管理:全方位安防监控视频融合云平台方案

EasyNVR是基于端-边-云一体化架构的安防监控视频融合云平台&#xff0c;具有简单轻量的部署方式与多样的功能&#xff0c;支持多种协议&#xff08;如GB28181、RTSP、Onvif、RTMP&#xff09;和设备类型&#xff08;IPC、NVR等&#xff09;&#xff0c;提供视频直播、录像、回放…

【ChatGPT】让ChatGPT生成特定时间段或主题的文章

让ChatGPT生成特定时间段或主题的文章 ChatGPT能够根据指定时间段或主题生成内容&#xff0c;关键在于清晰地编写Prompt以提供足够的上下文和细节信息。本文将介绍如何通过有效的提示语设计&#xff0c;利用ChatGPT生成符合特定时间段或主题需求的文章。 一、为什么需要指定时…