lxinghua

博客园 首页 新随笔 联系 订阅 管理

新建账户邮箱发送功能配置

1. 先创建新建账户功能

① shcool app serializer.py文件中创建新用户创建展示校验功能

User为系统自带,需要进行导入。

② school app views.py文件中创建student以及teacher等账户创建功能

import random
import string

from django.contrib.auth.models import Group
from django.shortcuts import render
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.status import HTTP_404_NOT_FOUND, HTTP_201_CREATED
from rest_framework.viewsets import ModelViewSet
from .serializers import *
from rest_framework.permissions import IsAuthenticated
from utils.permission import TeacherPermission


# Create your views here.


class ClassesViewSet(ModelViewSet):
    queryset = Classes.objects.filter(is_delete=False)
    serializer_class = ClassesSerializer
    # permission_classes = [IsAuthenticated]    # 在未登录的状态下无法查看数据信息
    permission_classes = [TeacherPermission]    # 定义老师是否登录前后查看的数据信息,同样也可以定义学生的

    def get_serializer(self, *args, **kwargs):  # 重写get_serializer,根据不同的操作显示不同的序列化器
        if self.action == 'students' or self.action == 'teachers':
            return CreateUserSerializer(*args, **kwargs)
        return ClassesSerializer(*args, **kwargs)

    @action(methods=['post'], detail=True)
    def students(self, request, pk):
        # 获取班级
        try:
            classes = self.get_queryset().get(id=pk)
        except Classes.DoesNotExist:
            return Response(status=HTTP_404_NOT_FOUND)
        # 得到前端传入的数据
        username = request.data['username']
        email = request.data['email']
        first_name = request.data['first_name']
        # 判断该用户是否已经在该班级,查询班级所有成员,以用户作为条件
        member = classes.member.filter(username=username)
        # 如果在,返回提示已存在
        if member:
            return Response({'msg': '该成员已经加入该班级'})
        # 如果不在,则判定该用户是否存在, 判断是否是新学员
        user = User.objects.filter(username=username)
        if user:
            user = user.first()
            # 如果存在,将该用户添加到班级,并返回
            classes.member.add(user)
            return Response(self.get_serializer(user).data)
        # 如果是新学员,使用序列化器进行反序列化,校验传入进来的数据
        user_serializer = self.get_serializer(data=request.data)
        user_serializer.is_valid(raise_exception=True)    # 对数据合法性进行验证
        user = User(username=username, first_name=first_name, email=email)
        # 生成初始密码
        source = string.ascii_letters + string.digits
        password = ''.join(random.sample(source, 6))   # 直接生成6位随机密码
        user.set_password(password)   # 对随机生成的6位密码进行加密
        user.save()
        # 发送邮件
        print(email, username, first_name, classes.name)

        # 设置成学生身份
        group = Group.objects.get(id=2)    # 2 为学生分组
        group.user_set.add(user)
        # 添加到对应班级
        classes.member.add(user)
        # 返回
        return Response(user_serializer.data, status=HTTP_201_CREATED)

    @action(methods=['post'], detail=True)
    def teachers(self, request, pk):
        # 获取班级
        try:
            classes = self.get_queryset().get(id=pk)
        except Classes.DoesNotExist:
            return Response(status=HTTP_404_NOT_FOUND)
        # 得到前端传入的数据
        username = request.data['username']
        email = request.data['email']
        first_name = request.data['first_name']
        # 判断该用户是否已经在该班级,查询班级所有成员,以用户作为条件
        member = classes.member.filter(username=username)
        # 如果在,返回提示已存在
        if member:
            return Response({'msg': '该成员已经加入该班级'})
        # 如果不在,则判定该用户是否存在, 判断是否是新学员
        user = User.objects.filter(username=username)
        if user:
            user = user.first()
            # 如果存在,将该用户添加到班级,并返回
            classes.member.add(user)
            return Response(self.get_serializer(user).data)
        # 如果是新学员,使用序列化器进行反序列化,校验传入进来的数据
        user_serializer = self.get_serializer(data=request.data)
        user_serializer.is_valid(raise_exception=True)    # 对数据合法性进行验证
        user = User(username=username, first_name=first_name, email=email)
        # 生成初始密码
        source = string.ascii_letters + string.digits
        password = ''.join(random.sample(source, 6))   # 直接生成6位随机密码
        user.set_password(password)   # 对随机生成的6位密码进行加密
        user.save()
        # 发送邮件
        print(email, username, first_name, classes.name)

        # 设置成学生身份
        group = Group.objects.get(id=1)   #  1 为老师分组
        group.user_set.add(user)
        # 添加到对应班级
        classes.member.add(user)
        # 返回
        return Response(user_serializer.data, status=HTTP_201_CREATED)

其中发送邮件的部分暂时为进行配置,需要用到celery配置方法。

一、Celery概述

Celery:专注于实时处理和任务调度的分布式任务队列,同时提供操作和维护分布式系统所需的工具,即插即用的异步任务队列。

优点:简单--易于使用和维护,由丰富的文档;高效--单个进程每分钟可以处理数百万个任务;灵活--几乎每个部分都可以自定义拓展。

二、Celery组成

组成:client--任务的发出者; Broker--中间人、任务队列;  Worker--任务的处理者。

三、安装与使用

安装: pip install celery

配置使用:

1. 首先在主项目目录建立celery_tasks文件夹,在此文件夹下建立celery_config.py文件,用于配置celery作业的缓存路径

2. 再在celery_tasks文件夹中建立celery_main.py的主执行文件,用于app调用

3. 最后在celery_tasks文件夹中建立email文件夹(任务文件夹,可根据需求进行命名,如邮箱,短信等), 建立tasks.py(名字固定)文件,在此文件中进行发送邮件配置

在上图中,可以看到需要导入settings.py文件中配置的发件人的邮箱信息,参考第四步中进行相关信息配置。

四、邮箱配置

在setting.py文件中进行配置,需要邮箱账号以及授权码,可根据需求习惯进行信息配置,以下以qq.com为例

1. 先在config文件夹中建立emailconfig.py配置邮箱账号以及授权码信息

2. 在回到settings.py文件中进行导入并配置服务器、端口等信息

完成以上所有配置后,回到school app  views.py文件进行发送功能配置

1. 导入方法

from celery_tasks.email.tasks import send_email_task

2. 调用方法

3. 最重要关键的一个步骤,需要进入虚拟环境主项目文件夹下,执行celery_main文件开启,方可进行邮件发送

4. 最后进入前端进行students/teachers账户添加确认是否有正常发送邮件

 

posted on 2023-05-30 12:33  興華  阅读(61)  评论(0编辑  收藏  举报