zoukankan      html  css  js  c++  java
  • celery异步发送邮件

    使用celery异步发送邮件,页面可以不需等发送邮件成功才加载,celery都工作原理如下图:

    邮件发送的过程:

    1. Django网站先发送到smtp服务器
    2. smtp服务器再把邮件发送方到目的邮箱

    在如上的情况下,假定Django网站发送邮件到smtp耗时是5s,那么用户在表单中输入信息之后提交,页面需要刷新5s才会跳转。显然这样极大影响了用户体验

    首先在项目虚拟环境里安装celery模块:

    • pipenv install celery
    • 如果使用的是win10操作系统运行celery4.x版本可能会有问题,需要安装另外一个模块:pipenv install eventlet

    在django项目里新建一个python package,文件名叫celery_tasks,里面创建一个叫tasks.py的python文件

    • 首先确保电脑上已经安装Redis数据库,pipenv install redis或者远程的redis是否已启动
    • 在tasks.py中的代码如下:其中第8-11行,是在使用不同的电脑运行celery的发起者、中间人、中间人时所需要用到的,这里我都是在一台电脑上运行,所以完全可以不写
    # # 在任务一段加这几句代码初始化配置
    # import os
    # import django
    # os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dailyfresh.settings')
    # django.setup()
    #使用celery
    from celery import Celery
    from django.core.mail import send_mail
    from django.conf import settings
    import time
    import redis
    
    #创建一个Celery的实例对象
    broker='redis://127.0.0.1:6379/8'
    
    app = Celery("celery_tasks.tasks",broker=broker)
    #定义发送邮件任务函数
    @app.task
    def send_register_active_email(to_email,username,token):
        """发送激活邮件"""
        # 发送邮件
        subject = '天天生鲜欢迎信息'
        message = ''
        sender = settings.EMAIL_FROM
        receiver = [to_email]
        html_message = '<h1>{0}, 欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的账户<br/><a href="http://127.0.0.1:8000/user/active/{1}">http://127.0.0.1/user/active/{2}</a>'.format(
            username, token, token)
        send_mail(subject, message, sender, receiver, html_message=html_message)
        #time.sleep(5)
    
    

    修改原先视图函数里发送邮件的部分,修改如下:

    #发送邮件
            # subject = '天天生鲜欢迎您'
            # message = ''
            # from_email = settings.EMAIL_FROM
            # recipient_list = [email]
            # html_message = '<h1>{0},欢迎您成为天天生鲜注册会员</h1>请点击下面的链接激活您的账户<br/><a href="http://127.0.0.1:8000/user/active/{1}">http://127.0.0.1:8000/user/active/{2}</a>'.format(username,token,token)
            # send_mail(subject,message,from_email,recipient_list,html_message=html_message)
            send_register_active_email.delay(email,username,token)
            #返回应答,跳转到首页
            return redirect(reverse('goods:index'))
    

    现在环境和代码都已经完成了,接下来在终端运行命令:

    • celery -A celery_tasks.tasks worker -l info -P eventlet

    • 其中 -P enentlet 是为了防止 win10 运行出错而附加的

    • 这样我们就启动了任务处理者

    • 如果任务处理者和redis都在另一台计算机上,就需要把项目和环境拷贝过去,然后也是同样的命令启动,不过在不同的计算机上就一定不能少了tasks.py中的8-11行的内容,因为tasks.py文件中的操作用到了Django项目中的一些配置

  • 相关阅读:
    最少代码的瀑布流实现
    GoLang代码规范
    wcf基础知识之ListenUri和ListenUriMode实现 逻辑地址和物理地址的分离
    STL学习笔记 string
    Bitbucket上使用SSH协作
    使用注册表文件(REG)添加、 修改或删除注册表子项和值
    《大话设计模式》Python版代码实现
    go windows 32位环境搭建
    借书场景领域建模分析
    E/R模型学习
  • 原文地址:https://www.cnblogs.com/venvive/p/12081865.html
Copyright © 2011-2022 走看看