admin管理员组文章数量:1634812
今天用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/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"
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/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分钟内按钮无法 点击、邮箱注册市验证是否注册过、同一邮箱申请两次验证码时删除旧的验证码等等。
版权声明:本文标题:Django实现邮箱注册系统 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1729200153a1189496.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论