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监听到任务,执行
收到邮件
点击链接即可激活用户