zoukankan      html  css  js  c++  java
  • 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监听到任务,执行

    收到邮件

    点击链接即可激活用户

       

      

       

  • 相关阅读:
    BeanFactory not initialized or already closed
    点击程序不弹出界面,但有后台服务
    python获取一年所有的日期
    keepalived实现高可用
    解决docker镜像pull超时问题
    docker容器的操作
    docker小结
    docker概述
    docker镜像操作
    python批量下载
  • 原文地址:https://www.cnblogs.com/c-pyday/p/11239261.html
Copyright © 2011-2022 走看看