• celery异步发送邮件


    利用Django框架发送邮件的详细过程,在前两天的博客中有所记录,但是单纯的那样发邮件是有非常大的问题的,这就需要celery异步发送来解决

    首先我们来看一下邮件发送的过程:

    • Django网站先发送到smtp服务器
    • smtp服务器再把邮件发送到目的邮箱

    这里有两个不确定时间:

    • Django网站----->smtp服务器
    • smtp服务器----->目的邮箱

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

    利用celery异步发送邮件:

    • 过程图解:这里我的所有程序都是在一台电脑上

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

    • 然后在Django项目里新建一个python package,名字叫做celery_tasks,里面创建一个python文件tasks.py

      • 首先确保你的电脑上已经安装有Redis数据库
      • 在项目的虚拟环境中还需要 pip install redis
      • 在tasks.py中的代码如下:其中第8-11行,是在使用不同的电脑运行celery的发起者、中间人、中间人时所需要用到的,这里我都是在一台电脑上运行,所以完全可以不写
         1 # 使用celery
         2 import time
         3 from celery import Celery
         4 from django.conf import settings
         5 from django.core.mail import send_mail
         6 
         7 # 在任务处理者一端加这几句,如果使用的不是同一台电脑,django环境的初始化,一般启动项目的一端不需要加
         8 import os
         9 import django
        10 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dailyfresh.settings')
        11 django.setup()
        12 
        13 # 创建一个Celery类的实例对象
        14 app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/9')
        15 
        16 # 定义任务函数
        17 @app.task()
        18 def send_register_active_mail(to_mail, username, token):
        19     """发送激活邮件"""
        20     # 组织邮件信息
        21     subject = '天天生鲜欢迎信息'
        22     message = ''
        23     sender = settings.EMAIL_FROM
        24     receiver = [to_mail,]
        25     html_message = '<h1>{},欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的用户<br><a href="http:127.0.0.1:8000/user/active/{}">http:127.0.0.1:8000/user/active/{}</a>'.format(
        26         username, token, token)
        27     send_mail(subject, message, sender, receiver, html_message=html_message)
        28     # 利用time模块模拟发了五秒钟邮件,原方法会页面加载5秒
        29     time.sleep(5)
      • 修改原先视图函数里发送邮件的部分,修改的部分如下,原先发送邮件的代码被我们封装到了tasks.py文件中的send_register_active_mail函数中
         1 # 导入上述创建的tasks.py文件中的异步发送邮件的方法
         2 from celery_tasks.tasks import send_register_active_mail
         3 
         4 # 发邮件
         5 # subject = '天天生鲜欢迎信息'
         6 # message = ''
         7 # sender = settings.EMAIL_FROM
         8 # receiver = [email]
         9 # html_message =  '<h1>{},欢迎您成为天天生鲜注册会员</h1>请点击下面链接激活您的用户<br><a href="http:127.0.0.1:8000/user/active/{}">http:127.0.0.1:8000/user/active/{}</a>'.format(username, token, token)
        10 # send_mail(subject, message, sender, receiver, html_message=html_message)
        11 # 上面注释掉了原先发送邮件的代码,现在用刚导入的函数所替代
        12 send_register_active_mail.delay(email, username, token)    
    • 现在环境和代码都已经完成了,接下来在终端运行命

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

      • 其中 -P enentlet 是为了防止 win10 运行出错而附加的
      • 这样我们就启动了任务处理者
      • 如果任务处理者和redis都在另一台计算机上,就需要把项目和环境拷贝过去,然后也是同样的命令启动,不过在不同的计算机上就一定不能少了tasks.py中的8-11行的内容,因为tasks.py文件中的操作用到了Django项目中的一些配置
    • 此时,在进行注册操作,虽然我们用 time.sleep函数模拟了邮件发送5s,但是当提交表单的时候发送邮件的操作已经是去异步处理了,页面几乎是没有太多延迟进行了刷新,这里就不再演示了,以下是在进行注册操作时,终端打印的信息

      • 最下面两行就是先接收到了发送邮件的请求,然后又执行发送的过程

  • 相关阅读:
    hdu 5446 Unknown Treasure lucas和CRT
    Hdu 5444 Elven Postman dfs
    hdu 5443 The Water Problem 线段树
    hdu 5442 Favorite Donut 后缀数组
    hdu 5441 Travel 离线带权并查集
    hdu 5438 Ponds 拓扑排序
    hdu 5437 Alisha’s Party 优先队列
    HDU 5433 Xiao Ming climbing dp
    hdu 5432 Pyramid Split 二分
    Codeforces Round #319 (Div. 1) B. Invariance of Tree 构造
  • 原文地址:https://www.cnblogs.com/springionic/p/10959353.html
Copyright © 2020-2023  润新知