diff --git a/enroll/email.py b/enroll/email.py index b2b6161..064229f 100644 --- a/enroll/email.py +++ b/enroll/email.py @@ -1,9 +1,8 @@ from random import Random # 用于生成随机码 from django.core.mail import send_mail # 发送邮件模块 from enroll.models import EmailVerifyRecord # 邮箱验证model -from django.conf import settings # setting.py添加的的配置信息 +from django.conf import settings # setting.py添加的的配置信息 import random -import datetime # 生成随机字符串 @@ -35,21 +34,21 @@ def send_code_email(email, send_type="register"): code = "".join([str(random.randint(0, 9)) for i in range(4)]) email_record.code = code email_record.email = email - email_record.send_type = send_type - email_record.send_time = datetime.datetime.now() + # email_record.send_type = send_type + # email_record.send_time = time.time() email_record.save() # 初始化为空 email_title = "" email_body = "" # 如果为注册类型 - if send_type == "register": - email_title = "注册激活" - # email_body = "请点击下面的链接激活你的账号:http://127.0.0.1:8000/active/{0}".format(code) - email_body = "您的邮箱注册验证码为:{0}, 该验证码有效时间为两分钟,请及时进行验证。".format(code) - # 发送邮件 - send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email]) - if not send_status: - return False + # if send_type == "register": + # email_title = "注册激活" + # # email_body = "请点击下面的链接激活你的账号:http://127.0.0.1:8000/active/{0}".format(code) + # email_body = "您的邮箱注册验证码为:{0}, 该验证码有效时间为两分钟,请及时进行验证。".format(code) + # # 发送邮件 + # send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email]) + # if not send_status: + # return False if send_type == "retrieve": email_title = "找回密码" email_body = "您的邮箱注册验证码为:{0}, 该验证码有效时间为两分钟,请及时进行验证。".format(code) @@ -57,4 +56,4 @@ def send_code_email(email, send_type="register"): send_status = send_mail(email_title, email_body, settings.EMAIL_FROM, [email]) if not send_status: return False - return True \ No newline at end of file + return True diff --git a/enroll/migrations/0004_alter_emailverifyrecord_send_time.py b/enroll/migrations/0004_alter_emailverifyrecord_send_time.py new file mode 100644 index 0000000..5f4475f --- /dev/null +++ b/enroll/migrations/0004_alter_emailverifyrecord_send_time.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.4 on 2022-04-17 13:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('enroll', '0003_alter_new_member_email_alter_new_member_phone_number'), + ] + + operations = [ + migrations.AlterField( + model_name='emailverifyrecord', + name='send_time', + field=models.DateTimeField(auto_now_add=True, verbose_name='发送时间'), + ), + ] diff --git a/enroll/migrations/0005_alter_emailverifyrecord_code.py b/enroll/migrations/0005_alter_emailverifyrecord_code.py new file mode 100644 index 0000000..3d1201a --- /dev/null +++ b/enroll/migrations/0005_alter_emailverifyrecord_code.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.4 on 2022-04-17 21:29 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('enroll', '0004_alter_emailverifyrecord_send_time'), + ] + + operations = [ + migrations.AlterField( + model_name='emailverifyrecord', + name='code', + field=models.CharField(max_length=5, verbose_name='验证码'), + ), + ] diff --git a/enroll/models.py b/enroll/models.py index 34c7a22..209a5ce 100644 --- a/enroll/models.py +++ b/enroll/models.py @@ -49,9 +49,9 @@ class New_member(models.Model): class EmailVerifyRecord(models.Model): # 验证码 - code = models.CharField(max_length=20, verbose_name="验证码") + code = models.CharField(max_length=5, verbose_name="验证码") email = models.EmailField(max_length=50, verbose_name="邮箱") # 包含注册验证和找回验证 # send_type = models.CharField(verbose_name="验证码类型", max_length=10, # choices=(("register", "注册"), ("forget", "找回密码"))) - send_time = models.DateTimeField(verbose_name="发送时间", auto_now=True) + send_time = models.DateTimeField(verbose_name="发送时间", auto_now_add=True) diff --git a/enroll/serializer.py b/enroll/serializer.py index ce6832a..e4c07bb 100644 --- a/enroll/serializer.py +++ b/enroll/serializer.py @@ -1,7 +1,8 @@ from rest_framework import serializers +from rest_framework.response import Response from rest_framework.validators import UniqueValidator - -from enroll.models import Department, New_member +from enroll.models import Department, New_member, EmailVerifyRecord +import time class Department_serializer(serializers.ModelSerializer): @@ -59,3 +60,20 @@ class Send_email_serializer(serializers.Serializer): queryset=New_member.objects.all(), message="该邮箱已存在")], error_messages={"max_length": "邮箱过长", "invalid": "请输入正确格式的邮箱"}) + + def validate_email(self, data): + # print(data) + try: + oj = EmailVerifyRecord.objects.get(email=data) + # print(oj.email)/ + send_time = str(oj.send_time).split('+')[0].split('.')[0] + send_time = time.mktime(time.strptime(send_time, '%Y-%m-%d %X')) + now = time.time() + # print(f"now={now},send={send_time}") + if now - send_time < 120: + raise serializers.ValidationError(code="verification_code", detail="请勿频繁发送验证码") + else: + # print(oj.email) + oj.delete() + except EmailVerifyRecord.DoesNotExist: + pass diff --git a/enroll/views.py b/enroll/views.py index 1cdcc79..3b89260 100644 --- a/enroll/views.py +++ b/enroll/views.py @@ -1,4 +1,3 @@ -from rest_framework.exceptions import ValidationError from rest_framework.response import Response from rest_framework.generics import GenericAPIView from enroll.models import Department, EmailVerifyRecord, New_member @@ -8,6 +7,7 @@ from rest_framework import status from rest_framework.views import APIView from enroll.email import send_code_email import re +import time class Department_message(GenericAPIView): @@ -30,20 +30,31 @@ class Sign_up(GenericAPIView): data = request.data serializer = self.get_serializer(data=data) code = data['verification_code'] - # print(f"code={code}") + print(f"code={code}") try: - if code != EmailVerifyRecord.objects.get(email=data['email']).code: - return Response({"verification_code": "邮箱验证码错误"}, status=status.HTTP_400_BAD_REQUEST) + oj = EmailVerifyRecord.objects.get(email=data['email']) + send_time = str(oj.send_time).split('+')[0].split('.')[0] + send_time = time.mktime(time.strptime(send_time, '%Y-%m-%d %X')) + now = time.time() + if now - send_time > 120: + return Response( + {"code": 40000, "msg": {"verification_code": "邮箱验证码过期"}}, + status=status.HTTP_400_BAD_REQUEST) + if code != oj.code: + return Response({"code": 40000, "msg": {"verification_code": "邮箱验证码错误"}}, + status=status.HTTP_400_BAD_REQUEST) except EmailVerifyRecord.DoesNotExist: - return Response({"verification_code": "请先发送验证码"}, status=status.HTTP_400_BAD_REQUEST) - serializer.is_valid(raise_exception=True) - serializer.save() - # print(serializer.errors) - # if ret: - # serializer.save() - # else: - # print(f"error_messages={serializer.errors}") - return Response({"code": 20000, "msg": "成功"}) + return Response({"code": 40000, "msg": {"verification_code": "请先发送验证码"}}, + status=status.HTTP_400_BAD_REQUEST) + ret = serializer.is_valid(raise_exception=False) + if ret: + serializer.save() + return Response({"code": 20000, "msg": "成功"}) + else: + error = {} + for (i, j) in zip(serializer.errors.keys(), serializer.errors.values()): + error[str(i)] = str(j[0]) + return Response({"code": 40000, "msg": error}, status=status.HTTP_400_BAD_REQUEST) def get(self, request): string = request.query_params.get('string', '') @@ -65,6 +76,14 @@ class Send_email(APIView): def post(self, request): data = request.data serializer = Send_email_serializer(data=data) - serializer.is_valid(raise_exception=True) - send_code_email(data.get("email")) - return Response({"code": 20000, "msg": "成功"}) + # code_serializer = Code_email_serializer() + ret = serializer.is_valid() + if ret: + # serializer.save() + send_code_email(data.get("email")) + return Response({"code": 20000, "msg": "成功"}) + else: + error = {} + for (i, j) in zip(serializer.errors.keys(), serializer.errors.values()): + error[str(i)] = str(j[0]) + return Response({"code": 40000, "msg": error}, status=status.HTTP_400_BAD_REQUEST)