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

  论坛元老 | 2024-11-20 18:15:20 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1737|帖子 1737|积分 5211

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

1. 模型(Model)

确保自定义用户模型中包含电子邮箱字段。比方:
  1. from django.contrib.auth.models import AbstractUser
  2. from django.db import models
  3. class CustomUser(AbstractUser):
  4.     email = models.EmailField(unique=True)
  5.     # 其他自定义字段...
复制代码
2. 表单(Form)

创建或修改用户登录表单,以包含电子邮箱字段。
  1. from django import forms
  2. from django.contrib.auth import get_user_model
  3. User = get_user_model()
  4. class EmailAuthenticationForm(forms.Form):
  5.     email = forms.EmailField(label="Email", max_length=254, widget=forms.EmailInput(attrs={'autofocus': True}))
  6.     password = forms.CharField(label="Password", widget=forms.PasswordInput)
  7.     def clean(self):
  8.         cleaned_data = super().clean()
  9.         email = cleaned_data.get('email')
  10.         password = cleaned_data.get('password')
  11.         if email and password:
  12.             if not User.objects.filter(email=email).exists():
  13.                 raise forms.ValidationError("Email is not registered")
  14.             user = authenticate(username=email, password=password)
  15.             if not user:
  16.                 raise forms.ValidationError("Invalid email or password")
复制代码
3. 视图(View)

在登录视图中添加逻辑来验证电子邮箱。
  1. from django.contrib.auth import authenticate, login
  2. from django.shortcuts import render, redirect
  3. from .forms import EmailAuthenticationForm
  4. def user_login(request):
  5.     if request.method == 'POST':
  6.         form = EmailAuthenticationForm(request.POST)
  7.         if form.is_valid():
  8.             email = form.cleaned_data.get('email')
  9.             password = form.cleaned_data.get('password')
  10.             user = authenticate(request, email=email, password=password)
  11.             if user is not None:
  12.                 login(request, user)
  13.                 return redirect('home')
  14.             else:
  15.                 form.add_error(None, "Invalid email or password.")
  16.     else:
  17.         form = EmailAuthenticationForm()
  18.     return render(request, 'users/login.html', {'form': form})
复制代码
4. 模板(Template)

在登录页面模板中添加电子邮箱输入字段。
  1. <!-- users/login.html -->
  2. <form method="post">
  3.     {% csrf_token %}
  4.     {{ form.email.errors }}
  5.     <label for="email">Email:</label>
  6.     <input type="email" name="email" required id="email">
  7.     {{ form.password.errors }}
  8.     <label for="password">Password:</label>
  9.     <input type="password" name="password" required id="password">
  10.     <button type="submit">Login</button>
  11. </form>
复制代码
5. 信号(Signal)

使用Django的信号在用户注册后发送验证邮件。
  1. from django.db.models.signals import post_save
  2. from django.dispatch import receiver
  3. from django.core.mail import send_mail
  4. from django.conf import settings
  5. @receiver(post_save, sender=User)
  6. def send_verification_email(sender, instance, created, **kwargs):
  7.     if created:
  8.         subject = 'Verify your email'
  9.         message = f'Hello {instance.email}, Please click on the link to verify your email.'
  10.         link = f'http://{settings.SITE_DOMAIN}verify/{instance.id}/{instance.email_token}/'
  11.         send_mail(subject, message + link, settings.EMAIL_HOST_USER, [instance.email], fail_silently=False)
复制代码
6. URLs

配置URL以处理验证链接的请求。
  1. # urls.py
  2. from django.urls import path
  3. from . import views
  4. urlpatterns = [
  5.     path('login/', views.user_login, name='login'),
  6.     path('verify/<int:user_id>/<str:token>/', views.verify_email, name='verify_email'),
  7. ]
复制代码
确保您的项目配置了邮件发送相关的设置,如EMAIL_BACKEND, EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD等。在项目标settings.py文件中添加或修改以下配置项。以下是详细的配置示例:
  1. # settings.py
  2. # 邮件后端设置
  3. EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
  4. # SMTP 服务器设置
  5. EMAIL_HOST = 'smtp.yourmailserver.com'  # SMTP 服务器地址
  6. EMAIL_PORT = 587  # SMTP 服务器端口(通常是587或465)
  7. EMAIL_USE_TLS = True  # 是否使用TLS(对于大多数SMTP服务器是必需的)
  8. # 或者使用SSL
  9. # EMAIL_USE_SSL = True
  10. # EMAIL_PORT = 465  # 如果使用SSL,端口通常是465
  11. # 发件人设置
  12. EMAIL_HOST_USER = 'your-email@example.com'  # 发件人邮箱地址
  13. EMAIL_HOST_PASSWORD = 'your-email-password'  # 发件人邮箱密码或应用专用密码
  14. # 可选设置
  15. EMAIL_SUBJECT_PREFIX = '[YourProject] '  # 发送邮件的主题前缀
  16. EMAIL_FROM_ADDRESS = 'webmaster@yourdomain.com'  # 默认发件人地址
  17. EMAIL_TIMEOUT = 10  # 发送邮件的超时时间(秒)
复制代码
请根据您的邮件服务提供商和个人账户信息,更换上述配置中的占位符(如yourmailserver.com、your-email@example.com和your-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项目能够发送邮件,比方在用户注册时发送验证邮件。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表