celery 是一个简单、灵活且可靠的,处理大量消息的分布式系统。包括处理异步任务队列、分布式消息传递、实时或调度任务等比较耗时的任务。html
win10:做开发机 要有python环境(celery,redis)python
虚拟机ubuntu:做服务器 要有python虚拟环境(celery,redis)redis
好比注册时需邮箱注册,那么django会把发送邮件的信息先发送到smtp服务器,而后smtp服务器在给你发送到目的邮箱,但smtp服务器发送到你目标的邮箱可能须要一些时间,或一些其余的缘由,而形成用户体验不好,因此这个问题celery能够帮咱们解决。数据库
celery+redis图解:django
任务队列是一个中间件,能够是RabbitMQ、Redis。这里咱们用的是Redis。ubuntu
客户端发出任务放到任务队列(redis)中,处理者监听到有任务以后,执行任务。服务器
*注意:任务队列和任务处理者能够有多个。app
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监听到任务,执行
收到邮件
点击连接便可激活用户