实现结果:点击发送邮件交给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