今天要完成注册逻辑流程图,注册接口以及前端页面,手机号和邮箱用正则校验,密码使用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
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
30
31
32
33
34
35
36
37
38
39
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr

#定义参数
my_mail = "2438702658@qq.com"
#授权码
my_pass = "feympxnumtwmdicj"


#定义发送邮件的方法
def mail(subject,content,mailaddr):

#声明邮件对象
msg = MIMEText(content,'plain','utf-8')

#设置发送方对象
msg['From'] = formataddr(['在线教育平台',my_mail])

#设置收件方对象
msg['To'] = formataddr(['尊敬的客户',mailaddr])

#设置标题
msg['Subject'] = subject

#设置smtp服务器
server = smtplib.SMTP_SSL("smtp.qq.com",465)

#登录邮箱
server.login(my_mail,my_pass)

#发送邮件
server.sendmail(my_mail,[mailaddr],msg.as_string())

#关闭smtp链接
server.quit()


# mail('验证码验证服务','您的验证码是6666,有限期为2分钟','2438702658@qq.com')

我们用函数进行封装,传入三个参数,分别是:

subject:标题,就是你所接收到的邮件的标题

content:邮件的内容

mailaddr:邮箱地址,就是收件方对象

脚本测试完成之后,我们就要写接口了,逻辑很简单,就是获取表单的邮箱,给这个邮箱发送验证码,然后将发送的验证码和表单中输入的验证码进行比对,成功之后将用户信息写入数据库,将邮箱写入redis数据库。

redis 在setting里导入.

1
2
3
import redis

redis = redis.Redis(host="127.0.0.1")

因为存入redis里的数据有时效性,这时我们就可以判断邮件是否发送频繁,因为这个数据有时效性,只要可以获取到用户邮箱,就说明发送频繁。否则再将邮箱写入数据库中。

1
2
3
4
5
6
7
8
9
10
11
12
13
class Send_mail(APIView):
def post(self, request):
code = random.randint(10000, 99999)
email = request.POST.get('email')
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})
if redis.get(email):
return Response({'message': "发送频繁", 'code': 400})
else:
redis.set(email, code)
redis.expire(email, 300)
mail('验证码验证服务', '您的验证码是%s,有限期为2分钟' % code, email)
return Response({'message': "发送成功", 'code': 200, 'data': code})

总结

以前写注册接口,总在想一个问题,经过这次的深入学习,真正了解了注册功能,md5加密方式,加上邮箱验证码后,对它的印象又深刻啦,编程加油!生活加油!