注册以及邮箱发送邮件
今天要完成注册逻辑流程图,注册接口以及前端页面,手机号和邮箱用正则校验,密码使用md5加密。
建表
首先我们在Navicat for mysql建一张用户表user,字段有用户名、密码、邮箱、手机号,另外我们需要给username添加一个索引un,这个的索引类型是Unique,意思就是唯一的,因为我们要做的项目是一个工作流平台,所以用户必须给它设成唯一。Unique它的作用是在后端可以自动对用户进行唯一性验证,同时也减少了访问数据库次数,节省了类视图的资源空间。
在以往的注册登陆中,大多使用django自带的make_password()来对用户密码进行加密,而md5,它是不能解密的,所以在登陆的时候就遇到一个难题,怎么将密码进行比对然后判断登录呢,这个问题先放一放,后面用户登录中,我们会详细介绍。
注册流程图
注册逻辑很简单,就是说你是用户,然后在表单中输入信息,在注册按钮上面写一个点击事件,在methods里定义这个方法,向后端发送一个post请求,将表单内容发给django端,在后端进行用户和密码的复杂度验证、手机号和邮箱正则匹配等等,如果成功,就写入数据库,并提示信息;如果失败,提示信息,打印错误。
校验
这里附上md5加密的方式:
导包:
from hashlib import sha256
1
2
3 md5 = hashlib.md5()
md5.update(password.encode())
password = md5.hexdigest()
手机号的正则匹配方法:
re.match(r"^1[356789]\d{9}$", phone)
邮箱正则匹配:
re.search(r"[0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}\.[com,cn,net]{1,3}", email)
以上内容如果完全会,注册接口就很简单啦。
这是我自己写的接口:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 # 注册接口
class Register(APIView):
def post(self, request):
# 接收参数
username = request.POST.get('username', None)
password = request.POST.get('password', None)
md5 = hashlib.md5()
md5.update(password.encode())
password = md5.hexdigest()
phone = request.POST.get('phone', None)
email = request.POST.get('email', None)
if not all([username, password, phone, email]):
return Response({'message': '参数不全', 'code': 400})
if not re.match(r"^1[356789]\d{9}$", phone):
return Response({'message': '手机号不合法', 'code': 400})
if not re.search(r"[0-9a-zA-Z_]{0,19}@[0-9a-zA-Z]{1,13}\.[com,cn,net]{1,3}", email):
return Response({'message': '邮箱不正确', 'code': 400})
# 唯一性验证
try:
user = User(username=username, password=password, phone=phone, email=email)
user.save()
return Response({'message': '注册成功', 'code': 200})
except Exception as e:
print('错误信息为:', e)
return Response({'message': '注册失败', 'code': 400})
可以看到,上面的password使用了md5加密,None是当获取的值为空的时候,默认给它设为空值,避免获取不到值而报错。
这里最主要的问题就是怎么使用md5加密,如图的加密方式是我在百度上面找的,写得很好,我根据它写了一个脚本,用它来生成密文,用做登录时与数据库里的密文进行比对。
####脚本如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 import hashlib
def make_password(mypass):
md5 = hashlib.md5()
#定义加密对象
sign_str = mypass
# 转码
sign_utf8 = str(sign_str).encode(encoding="utf-8")
#加密
md5.update(sign_utf8)
#生成密文
md5_server = md5.hexdigest()
return md5_server
print(make_password('1234'))
这个脚本的作用不言而喻。可以加密并生成密文,就可以用它来比对密码。
邮箱发送邮件
我们写一个发送邮箱的脚本
1 | import smtplib |
我们用函数进行封装,传入三个参数,分别是:
subject:标题,就是你所接收到的邮件的标题
content:邮件的内容
mailaddr:邮箱地址,就是收件方对象
脚本测试完成之后,我们就要写接口了,逻辑很简单,就是获取表单的邮箱,给这个邮箱发送验证码,然后将发送的验证码和表单中输入的验证码进行比对,成功之后将用户信息写入数据库,将邮箱写入redis数据库。
redis 在setting里导入.
1 | import redis |
因为存入redis里的数据有时效性,这时我们就可以判断邮件是否发送频繁,因为这个数据有时效性,只要可以获取到用户邮箱,就说明发送频繁。否则再将邮箱写入数据库中。
1 | class Send_mail(APIView): |
总结
以前写注册接口,总在想一个问题,经过这次的深入学习,真正了解了注册功能,md5加密方式,加上邮箱验证码后,对它的印象又深刻啦,编程加油!生活加油!