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

embedded/2024/11/25 4:46:42/

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

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

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/embedded/140288.html

相关文章

使用eclipse构建SpringBoot项目

我这里用eclipse2018版本做演示&#xff0c;大家有需要的可以下载Eclipse Downloads | The Eclipse Foundation 1.打开eclipse&#xff0c;选择存放代码的位置 2.选择 file >> new >> project >> 选择springboot文件下的 spring starter project 2.这里选择N…

Oracle-表空间/用户的创建与使用

-- 对象 -- 需要create的都是对象 已学的对象&#xff1a;表 table -- 普通用户 只能查询user开头的数据字典 select tablespace_name from user_tablespaces; -- dba用户才能够查询 select tablespace_name from dba_tablespaces; -- 创建表空间&#xff08;需要管理员…

自动驾驶系统研发系列—智能驾驶新高度:解析ESS驾驶员转向辅助系统

🌟🌟 欢迎来到我的技术小筑,一个专为技术探索者打造的交流空间。在这里,我们不仅分享代码的智慧,还探讨技术的深度与广度。无论您是资深开发者还是技术新手,这里都有一片属于您的天空。让我们在知识的海洋中一起航行,共同成长,探索技术的无限可能。 🚀 探索专栏:学…

ASCB1系列APP操控末端回路智能微断 物联网断路器 远程控制开关 学校、工厂、农场、商业大楼等可用

安科瑞戴婷 Acrel-Fanny ASCB1系列智能微型断路器是安科瑞电气股份有限公司全新推出的智慧用电产品&#xff0c;产品由智能微型断路器与智能网关两部分组成&#xff0c;可用于对用电线路的关键电气因素&#xff0c;如电压、电流、功率、温度、漏电、能耗等进行实时监测&#x…

《生成式 AI》课程 作业6 大语言模型(LLM)的训练微调 Fine Tuning -- part1

资料来自李宏毅老师《生成式 AI》课程&#xff0c;如有侵权请通知下线 Introduction to Generative AI 2024 Spring 该文档主要介绍了国立台湾大学&#xff08;NTU&#xff09;2024 年春季 “生成式人工智能&#xff08;GenAI&#xff09;” 课程的作业 5&#xff08;GenAI HW…

NVR管理平台EasyNVR多品牌NVR管理工具的流媒体视频融合与汇聚管理方案

随着信息技术的飞速发展&#xff0c;视频监控已经成为现代社会安全管理和业务运营不可或缺的一部分。无论是智慧城市、智能交通、还是大型企业、校园安防&#xff0c;视频监控系统的应用都日益广泛。NVR管理平台EasyNVR&#xff0c;作为功能强大的流媒体服务器软件&#xff0c;…

【北京迅为】iTOP-4412全能版使用手册-第七章 Android 4.4系统编译

iTOP-4412全能版采用四核Cortex-A9&#xff0c;主频为1.4GHz-1.6GHz&#xff0c;配备S5M8767 电源管理&#xff0c;集成USB HUB,选用高品质板对板连接器稳定可靠&#xff0c;大厂生产&#xff0c;做工精良。接口一应俱全&#xff0c;开发更简单,搭载全网通4G、支持WIFI、蓝牙、…

C#中的二维数组的应用:探索物理含义与数据结构的奇妙融合

在C#编程中&#xff0c;二维数组&#xff08;或矩阵&#xff09;是一种重要的数据结构&#xff0c;它不仅能够高效地存储和组织数据&#xff0c;还能通过其行、列和交叉点&#xff08;备注&#xff1a;此处相交处通常称为“元素”或“单元格”&#xff0c;代表二维数组中的一个…