celery的使用

celery介绍

celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统。包括处理异步任务队列、分布式消息传递、实时或调度任务等比较耗时的任务。

环境:

win10:作开发机   要有python环境(celery,redis)

虚拟机ubuntu:作服务器 要有python虚拟环境(celery,redis)

举个例子:

比如注册时需邮箱注册,那么django会把发送邮件的信息先发送到smtp服务器,然后smtp服务器在给你发送到目的邮箱,但smtp服务器发送到你目标的邮箱可能需要一些时间,或一些其他的原因,而造成用户体验很差,所以这个问题celery可以帮我们解决。

celery+redis图解:

任务队列是一个中间件,可以是RabbitMQ、Redis。这里我们用的是Redis。

客户端发出任务放到任务队列(redis)中,处理者监听到有任务之后,执行任务。

*注意:任务队列和任务处理者可以有多个。

使用celery(借助天天生鲜的例子)

1.在项目中新建个python包存放任务(tasks.py为任务文件)

2.编写任务文件tasks.py

# _*_ coding:utf-8 _*_
__author__ = 'cc'
__date__ = '2019/6/11 16:59'

from celery import Celery
from django.conf import settings
from django.core.mail import send_mail
#from django_redis import get_redis_connection


#任务处理者(服务器)所用到的初始化
import os
# import django
# os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ttsx2.settings")
# django.setup()

from goods.models import GoodsType,IndexGoodsBanner,IndexPromotionBanner,IndexTypeGoodsBanner
from django.template import loader

#创建一个Celery类的实例对象
app = Celery('celery_tasks.tasks',broker='redis://192.168.75.128:6379/1') #第一个参数为对象名,一般写路径名,broker:连接中间件redis,后面数字表示第几个数据库,最多到第15个

#定义任务函数
@app.task   #必须要有   对函数进行装饰
def send_register_active_email(to_email,username,token):
    """
    发送激活邮件
    :param to_email:
    :param username:
    :param token:
    :return:
    """
    subject = 'ttsx欢迎信息'
    message = '{0},欢迎您,请点击下面链接激活您的账户:http://127.0.0.1:8000/user/active/{1}'.format(username, token)
    sender = settings.EMAIL_FROM
    receiver = [to_email]
    send_mail(subject, message, sender, receiver)

3.配置views.py

#注册类视图
class RegisterView(View):
    def get(self,request):
        return render(request,'register.html',{})
    def post(self,request):
        forms = RegisterForm(request.POST)
        if forms.is_valid():
            username = forms.cleaned_data['username']
            password = forms.cleaned_data['password2']
            email = forms.cleaned_data['email']

            user = User.objects.create_user(username=username,password=password,email=email)
            user.is_active=0
            user.save()

            #发送激活邮件,包含激活链接:http://127.0.0.1:8000/user/active/1
            #激活链接中需要包含用户的身份信息   并且要把身份信息进行加密
            #加密用户的身份信息,生成激活token
            serializer = Serializer(settings.SECRET_KEY,3600)   #实例化对象
            info = {'confirm':user.id}
            token = serializer.dumps(info)          #加密  bytes类型
            token = token.decode()    #解码   字符串
            #发邮件
            # subject = 'ttsx欢迎信息'
            # message = '{0},欢迎您,请点击下面链接激活您的账户:http://127.0.0.1:8000/user/active/{1}'.format(username, token)
            # sender = settings.EMAIL_FROM
            # receiver = [email]
            # send_mail(subject, message, sender, receiver)
            send_register_active_email.delay(email,username,token)   #调用任务文件send_register_active_email函数
return render(request, 'register.html', {'msg':forms})

4.把整个项目拷贝到(虚拟机)服务器上。

5.(虚拟机)服务器配置

   (1)启动redis服务

   

   (2)  进入该项目  启动虚拟环境

     

  (3)打开任务处理者用到的初始化

   进入任务文件删掉注释

   

   (4)启动worker监听任务

   

   

结果:

使用邮箱注册

前提:在settings.py中配置发送邮件配置

如:

运行项目

点击注册后发送任务到中间件redis中,worker监听到任务,执行

收到邮件

点击链接即可激活用户

 

 

 

 

   

 

  

   

 

posted @ 2019-07-24 17:00  cmap  阅读(422)  评论(1编辑  收藏  举报