Django实现邮箱注册系统

今天用Django来实现简易的邮箱注册系统,一个完整的邮箱注册系统需要有数据库存储信息、视图提供邮箱验证和前端页面展示数据

 

一、数据建模

在models.py中建立模型:

邮箱验证表

对于邮箱验证来说需要的字段有:验证码、邮箱和注册时间,注册时间用于验证验证码是否过期。

from django.db import models
class EmailValid(models.Model):
    value = models.CharField(max_length = 32)
    email_address = models.EmailField()
    times = models.DateTimeField()

用户注册信息表

验证成功后需要将用户信息存储在注册表中。

class user(models.Model):
    email = models.EmailField()
    password = models.CharField(max_length=64)

别忘记同步数据库:

#检查错误
python manage.py check
#同步表
python manage.py makemigrations
#同步字段
python manage.py migrate

 

二、添加静态页面

静态页面需要添加一个表单,表单中有邮箱、验证码、获取验证码、密码和注册按钮,注意在写的时候给input标签加上name属性,这样视图文件才能获取。还有提交表单一定要添加csrf防御。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>邮箱验证</title>
    <style>
        input {
            border-radius: 5%;
            height: 40px;
            box-shadow: 0 0 10px grey
        }
        #zemail {
            display: inline-block;
            width: 100px;
            height: 40px;
            box-shadow: 0 0 10px grey;
            border-radius: 5%;
            border: 2px black solid;
            text-decoration: none;
            text-align: center;
            line-height: 40px;
            margin-left: 10px;
        }
    </style>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <p>邮  箱:<input style="width: 250px;margin-left: 12px" name="email" id="email" type="email" placeholder="请输入邮箱"></p>
    <p>
        验证码:<input style="width: 100px" name="value" type="text" placeholder="请输入验证码">
        <label id="zemail">获取验证码</label> 
    </p>
    <p>密 码:<input style="width: 250px;margin-left: 12px" name="pwd" type="password" placeholder="请输入密码">
    <p><input style="width: 100px;height: 40px;margin-top: 30px" type="submit" value="注册" ></p>
</form>

 

三、添加视图和路由

视图函数 views.py:

def emaillog(request):
    return render(request,'emailV/email.html',locals())

路由 urls.py:

urlpatterns = [
    path('admin/', admin.site.urls),
    path('emaillog/',emaillog)
]

运行项目,输入路由,查看样式:

四、获取验证码逻辑

输入邮箱后点击获取验证码,点击获取验证码的时候,页面不会刷新,所以点击获取验证码需要使用Ajax进行数据get请求。

先在前端页面写上ajax框架:

这里需要获取填写在邮箱表单框中的邮箱,ajax的方法使用get。

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script>
    $(function () {
        $('#zemail').click(function () {  <!--获取验证码按钮添加点击事件-->
            email = $('#email').val();  <!--获取输入的邮箱-->
            $.ajax(
                {
                    url:'',
                    type:'get',
                    data:'',
                    success:function (data) {
                        
                    }
                }
            )
        })
    })
</script>

在视图中编写生成验证码函数:

验证码使用随机生成的4位数字即可

import random
#随机验证码函数
def getRandomData():
    result = str(random.randint(1000,9999))
    return result

在配置中添加邮件配置:

我这里采用163邮箱的smtp服务器。

首先需要开启163的smtp服务器:

然后要获取到163的smtp服务器地址和端口号:

在配置文件中(setting.py)增加邮件配置:

EMAIL_HOST_USER = '你的163邮箱'
EMAIL_HOST_PASSWORD = '你的163邮箱密码'
EMAIL_USE_SSL = True  
EMAIL_HOST = "smtp.163.com"
EMAIL_PORT = 994  

在视图中编写邮件发送函数:

收件箱肯定是通过ajax获取到的,所以先从get请求中获取收件箱。

然后发送邮件,邮件中包含验证码:

from django.core.mail import EmailMultiAlternatives
from django.http import JsonResponse  #ajax接收json返回的数据
from emailviled.settings import EMAIL_HOST_USER #从配置中导入发件人

def sendMessage(request):
    result = {"staue": "error", "data": ""}  #ajax的返回值
    if request.method == 'GET' and request.GET: #确定是否有get请求
        recver = request.GET.get('email')  #获取前端输入的注册邮箱,也就是发件人
        subject = "测试邮件"   #邮件主题
        text_content = ""   #发送的文本内容
        value = getRandomData()  #通过验证码函数获取验证码是
        #带有html样式的文本内容
        html_content = """    
                    <div>
                        <p>
                            尊敬的q商城用户,您的用户验证码是:%s,打死不要告诉别人。
                        </p>
                    </div>
                    """ %value
        # 确认邮件信息:主题、内容、发件人、收件人(可多人)
        message = EmailMultiAlternatives(subject, text_content, EMAIL_HOST_USER, [recver])  
        message.attach_alternative(html_content, "text/html")  #添加带html样式的内容
        message.send()  #发送
        result['statue'] = 'success'
        result['data'] = '发送成功'
        return JsonResponse(result)

为了验证数据,肯定需要将信息存入邮件注册数据表中,所以在发送邮件函数中增加存入数据库的过程:

首先导入数据表,然后导入时间模块,来记录验证码生成时间:


from django.core.mail import EmailMultiAlternatives
from django.http import JsonResponse  #ajax接收json返回的数据
from emailviled.settings import EMAIL_HOST_USER #从配置中导入发件人
from emailv.models import *
import datetime

def sendMessage(request):
    result = {"staue": "error", "data": ""}  #ajax的返回值
    if request.method == 'GET' and request.GET: #确定是否有get请求
        recver = request.GET.get('email')  #获取前端输入的注册邮箱,也就是发件人
        subject = "测试邮件"   #邮件主题
        text_content = ""   #发送的文本内容
        value = getRandomData()  #通过验证码函数获取验证码是
        #带有html样式的文本内容
        html_content = """    
                    <div>
                        <p>
                            尊敬的q商城用户,您的用户验证码是:%s,打死不要告诉别人。
                        </p>
                    </div>
                    """ %value
        # 确认邮件信息:主题、内容、发件人、收件人(可多人)
        message = EmailMultiAlternatives(subject, text_content, EMAIL_HOST_USER, [recver])
        message.attach_alternative(html_content, "text/html")  #添加带html样式的内容
        message.send()  #发送
        result['statue'] = 'success'
        result['data'] = '发送成功'

        e = EmailValid() #实例化表
        e.email_address = recver  #存入注册邮箱
        e.value = value     #存入验证码
        e.times = datetime.datetime.now()  #存入时间
        e.save() #保存入数据库
        
    return JsonResponse(result) #返回

配置发送邮件函数路由:

from django.contrib import admin
from django.urls import path
from emailv.views import *

urlpatterns = [
    path('admin/', admin.site.urls),
    path('emaillog/',emaillog),
    path('sendemail/', sendMessage),
]

补全前端页面ajax:

添加一个标签用来提醒用户验证码已经发送

补全ajax:

<script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
<script>
    $(function () {
        $('#zemail').click(function () {
            email = $('#email').val();
            $.ajax(
                {
                    url:'/sendemail/?email='+email,  <!--传给传给视图函数的请求-->
                    type:'get',
                    data:'',
                    success:function (data) {
                         $('#stat').text(data['data'])
                    }
                }
            )
        })
    })
</script>

这时候就可以试验了:一般都在垃圾箱里。所以收不到去垃圾箱里看看:

数据库中:

 

五、验证验证码并注册用户

在视图中编写函数验证验证码是否正确、是否过期,验证码和邮箱是否匹配,如果没问题,将数据存入数据库:

将所有导入的包都放在最上面:

这是一个良好的习惯,要不容易出现重复导包:

from django.shortcuts import render
from django.core.mail import EmailMultiAlternatives
from django.http import JsonResponse,HttpResponseRedirect  #ajax接收json返回的数据
from emailviled.settings import EMAIL_HOST_USER #从配置中导入发件人
from emailv.models import *
import datetime,time

def emaillog(request):
    return render(request,'emailV/email.html',locals())

补充之前的的登陆函数:

def emaillog(request):
    result = {"staue": "error", "data": ""}  # 注册状态字典
    if request.method == 'POST' and request.POST:
        email = request.POST.get('email')  # 获取注册邮箱
        code = request.POST.get('value')  # 获取注册验证码
        pwd = request.POST.get('pwd')  # 获取输入的密码

        db_email = EmailValid.objects.filter(email_address=email).first()  # 根据邮箱注册表中的数据
        if db_email:  # 如果表中存在该邮箱
            if code == db_email.value:  # 如果验证码和库中验证码一致
                now = time.mktime(  # 获取现在时间并转为秒,需要导入time包
                    datetime.datetime.now().timetuple()
                )
                db_now = time.mktime(db_email.times.timetuple())  # 获取邮箱验证表中时间转为秒
                if now - db_now > 86400:  # 如果验证码时间差大于一天
                    result['data'] = '验证码过期'
                    db_email.delete()  # 删除验证表中该注册数据
                else:  # 如果验证码未过期
                    b = user()  # 实例化user表
                    b.email = email  # 存储注册邮箱
                    b.password = pwd  # 存储注册密码
                    b.save()  # 数据存入用户表
                    db_email.delete()  # 删除验证表中该注册数据
                    result['data']='注册成功'
            else:  # 如果验证码和库中验证码不一致
                result['data'] = '验证码错误'
        else:  # 如果表中不存在该邮箱
            result['data'] = '邮箱不匹配'
    return render(request,'emailV/email.html',locals())

给前端添加一个标签,显示注册状态

尝试注册:

这样,一个简易邮箱注册系统就做完了,还有很多功能可以去完善,例如:点击注册后1分钟内按钮无法 点击、邮箱注册市验证是否注册过、同一邮箱申请两次验证码时删除旧的验证码等等。

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值