django+celery异步发送邮件

实现结果:点击发送邮件交给celery处理,减少页面响应时间

celery_send

├── __init__.py
├── __pycache__
│   ├── __init__.cpython-37.pyc
│   ├── celery.cpython-37.pyc
│   ├── celeryconfig.cpython-37.pyc
│   └── tasks.cpython-37.pyc
├── celery.py
├── celeryconfig.py
└── tasks.py

init.py

from .celery import app as celery_app

__all__ = ['celery_app']

celery.py

from celery import Celery
from celery_send import celeryconfig
#os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blogproject.settings')
# 实例化celery对象,任务调度利器(分布式任务调度模块)
app=Celery('celery_send')

#app.config_from_object('django.conf:settings', namespace='CELERY')
# 加载app配置文件
# 1. app.config_from_object('celery_send.celeryconfig')
# 2.
app.config_from_object(celeryconfig)
DEBUG = False

if __name__ == '__main__':
    app.start()

celeryconfig.py

# Celery本身不含消息服务,它使用第三方消息服务来传递任务
# 选redis作为消息服务(Broker),Celery默认使用的是RabbitMQ
# 也可以通过 -b 选项在命令行进行设置其他的中间人(Broker)
import os

# 倒入djnago环境后记得关DEBUG不然会内存泄漏
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blogproject.settings')
# DEBUG = False

# 消息队列选择了redis
broker_url = 'redis://127.0.0.1:6379/0'

# 保存结果:如果想跟踪任务状态,Celery需要存储任务状态信息.
# Celery 内置了一些后端结果:SQLAlchemy/Django ORM、Memcached、Redis、 RPC (RabbitMQ/AMQP)以及自定义的后端结果存储中间件
result_backend = 'redis://127.0.0.1:6379/1'

# 指定序列化方式
task_serializer = 'json'

# 指定区时间
tiemzone = 'Asia/Shanghai'

# 导入任务模块列表
include = ['celery_send.tasks', ]

tasks.py

# 装饰器从所有可调用对象中创建任务类
from django.core.mail import send_mail

from blogproject.settings import EMAIL_FROM
from celery_send.celery import app


@app.task
# 任务函数自定义
def send_email(title,message):
        # 收件人
        email = ' '
        ##发送邮件
        """
        subject, message, from_email, recipient_list,
              fail_silently=False, auth_user=None, auth_password=None,
              connection=None, html_message=None
        主题 ,信息,发件人,收件人列表
        """
        send_mail(title, message, EMAIL_FROM, [email, ])

开启worker

celery  -A   celery_send   worker  -l   info 

前端:

在这里插入图片描述

后端视图函数:

def index(request):
    if request.method == "POST":
        name = request.POST.get('name')
        # 获取前端的email
        email = request.POST.get('email')
        sex = request.POST.get('sex')
        subject = request.POST.get('subject')
        message = request.POST.get('message')
        print(message)
        title="发送者:%s 邮箱:%s  性别:%s  主题:%s" %(name,email,sex,subject)
        send_email.delay(title,message)
    return render(request, 'index.html')

执行tasks成功后work端:

[2020-04-20 17:51:59,189: INFO/ForkPoolWorker-2] Task celery_send.tasks.send_email[3a14608e-03ef-405e-9327-674f7456553d] succeeded in 5.670914049999965s: None
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值