django-celery-简单实现异步发邮件修改密码

版本

python == 3.7.6

django == 2.1.8

celery == 4.4.7

redis == 3.5.3

eventlet == 0.26.1

首先在项目下创建我们所需要的文件celecry config

在这里插入图片描述
以上dashixun为我们的项目名称

settings中的配置

# 配置邮件发送
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'  # 如果为163邮箱,设置为smtp.163.com
EMAIL_PORT = 25  # 或者 465/587是设置了 SSL 加密方式
# 发送邮件的邮箱
EMAIL_HOST_USER = '885682182@qq.com'
# 在邮箱中设置的客户端授权密码
EMAIL_HOST_PASSWORD = 'fsqgtiyrntplbdad'  # 第三方登陆使用的授权密码
EMAIL_USE_TLS = True  # 这里必须是 True,否则发送不成功
# 收件人看到的发件人, 必须是一直且有效的
EMAIL_FROM = '权梁旭<885682182@qq.com>'
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

需要将我们发送的邮箱替换成自己的邮箱
客户端授权密码从下图中获取
QQ邮箱 设置/帐户 下
在这里插入图片描述

init中所需配置

# 绝对引用,使我们的celery模块不会与原始的celery冲突
from __future__ import absolute_import, unicode_literals
# 加入绝对引入以后,导入当前模块下的内容方法: from xx import xx as xx
from .celery import app as celery_app

__all__ = ('celery_app',)

celery中所需配置

# celery.py文件
import os
from celery import Celery
# 把celery和django进行组合,识别和加载django的配置文件
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dashixun.settings')
# 创建celery实例
app = Celery('dashixun')
# 指定celery消息队列的配置
app.config_from_object('dashixun.config', namespace='CELERY')
# 从所有的django-app中加载任务
app.autodiscover_tasks()



@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

以上需要将代码中的第五行第七行以及第九行中的项目名替换成自己的项目名

config中所需配置

# 消息中间人设置
broker_url = 'redis://127.0.0.1:6379/15'
# 结果存储设置
result_backend = 'redis://127.0.0.1:6379/14'

然后在我们需要执行异步的app下创建tasks

在这里插入图片描述

tasks中所需配置

# 绝对引用,使我们的celery模块不会与原始的celery冲突
from __future__ import absolute_import, unicode_literals
# 导入原始的celery模块中shared_task    from xx import xx
from celery import shared_task
# 使用django内置函数发送邮件
from django.core.mail import send_mail
# 导入django的settings
from django.conf import settings
from dashixun.celery import app

@app.task
def send_mail_task(username, email, user_id):
    """
    使用django内置函数发送邮件
    """
    subject = '工单系统找回密码'  # 主题
    message = ''  # 文本消息
    from_email = settings.EMAIL_FROM
    recipient_list = [email]

    html_message = '<h3>您好{},欢迎来到工单系统找回密码!
    请点击以下链接进行激活:</br>
    <a href="http://127.0.0.1:8080/changepwd/?user_id={}">点击修改密码</a></h3>'
    .format(username, user_id)

    send_mail(
        subject=subject,
        message=message,
        from_email=from_email,
        recipient_list=recipient_list,
        html_message=html_message
    )

# celery -A dashixun worker -l info -P eventlet

以上a href 标签中的地址与自己前端页面对应根据自己的前端进行修改
以上最后一行代码为执行异步命令 将其中的dashixun替换成自己的项目名即可

View中发送邮箱接口

class Forgot_Password_View(APIView):
    """
    发送邮箱
    """
    def post(self, request):
        username = request.data.get('username')
        email = request.data.get('email')
        print(username, email)
        if not all([username, email]):
            return Response({"msg": "参数不完整", "code": 400})
        user_obj = User.objects.filter(username=username).first()
        print(user_obj)
        if user_obj:
            send_mail_task.delay(username, email, user_obj.id)

            return Response({"msg": "邮箱发送成功", "code": 200})
        else:
            return Response({'msg': "err"})

Views中修改密码接口

class ChangePwdView(APIView):
    '''
    修改密码
    '''
    def put(self,request):
        uid = request.data.get('uid')
        newpassword = request.data.get('password')
        user_obj = User.objects.filter(id=uid).first()
        if user_obj:
            user_obj.password = make_password(newpassword)
            user_obj.save()
            return Response({'msg':'修改成功','code':200})
        else:
            # print(user_obj.errors)
            return Response({'msg':'修改失败','code':400})

urls配置

urlpatterns = [
    path('find/',Forgot_Password_View.as_view()),  #发送邮件
    path('change/',ChangePwdView.as_view()),   #修改密码

]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值