celery异步发送邮件
利用Django框架发送邮件的详细过程,在前两天的博客中有所记录,但是单纯的那样发邮件是有非常大的问题的,这就需要celery异步发送来解决
首先我们来看一下邮件发送的过程:
- Django网站先发送到smtp服务器
- smtp服务器再把邮件发送到目的邮箱
这里有两个不确定时间:
- Django网站----->smtp服务器
- smtp服务器----->目的邮箱
这样的情况下,假定Django网站发送邮件到smtp耗时是5s,那么用户在表单中输入信息之后提交,页面需要刷新5s才会跳转。显然,这是我们非常不愿意看见的情况,极大的影响了用户体验。
利用celery异步发送邮件:
过程图解:这里我的所有程序都是在一台电脑上
首先在项目虚拟环境里安装celery模块:
- pip install celery
- 如果你用的是win10操作系统运行celery 4.x版本可能会有问题,需要安装另外一个模块:pip install eventlet
- 如果win10不进行上一步可能会出现问题,参考博客:https://blog.csdn.net/qq_30242609/article/details/79047660
然后在Django项目里新建一个python package,名字叫做celery_tasks,里面创建一个python文件tasks.py
- 首先确保你的电脑上已经安装有Redis数据库
- 在项目的虚拟环境中还需要 pip install redis
- 在tasks.py中的代码如下:其中第8-11行,是在使用不同的电脑运行celery的发起者、中间人、中间人时所需要用到的,这里我都是在一台电脑上运行,所以完全可以不写
# 使用celery
import time
from celery import Celery
from django.conf import settings
from django.core.mail import send_mail # 在任务处理者一端加这几句,如果使用的不是同一台电脑,django环境的初始化,一般启动项目的一端不需要加
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dailyfresh.settings')
django.setup() # 创建一个Celery类的实例对象
app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/9') # 定义任务函数
@app.task()
def send_register_active_mail(to_mail, username, token):
"""发送激活邮件"""
# 组织邮件信息
subject = '天天生鲜欢迎信息'
message = ''
sender = settings.EMAIL_FROM
receiver = [to_mail,]
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)
send_mail(subject, message, sender, receiver, html_message=html_message)
# 利用time模块模拟发了五秒钟邮件,原方法会页面加载5秒
time.sleep(5) - 修改原先视图函数里发送邮件的部分,修改的部分如下,原先发送邮件的代码被我们封装到了tasks.py文件中的send_register_active_mail函数中
# 导入上述创建的tasks.py文件中的异步发送邮件的方法
from celery_tasks.tasks import send_register_active_mail # 发邮件
# subject = '天天生鲜欢迎信息'
# message = ''
# sender = settings.EMAIL_FROM
# receiver = [email]
# 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)
# send_mail(subject, message, sender, receiver, html_message=html_message)
# 上面注释掉了原先发送邮件的代码,现在用刚导入的函数所替代
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,但是当提交表单的时候发送邮件的操作已经是去异步处理了,页面几乎是没有太多延迟进行了刷新,这里就不再演示了,以下是在进行注册操作时,终端打印的信息
最下面两行就是先接收到了发送邮件的请求,然后又执行发送的过程
celery异步发送邮件的更多相关文章
- celery异步任务、定时任务
阅读目录 一 什么是Celery? 二 Celery的使用场景 三 Celery的安装配置 四 Celery异步任务 五Celery定时任务 六在Django中使用Celery 一 什么是Cele ...
- C# 利用SMTP异步发送邮件
C#实现收发邮件功能需要用到两个命名空间 System.Net; 和 System.Net.Mail; SmtpClient client = new SmtpClient("smtp.g ...
- Django使用Celery异步任务队列
1 Celery简介 Celery是异步任务队列,可以独立于主进程运行,在主进程退出后,也不影响队列中的任务执行. 任务执行异常退出,重新启动后,会继续执行队列中的其他任务,同时可以缓存停止期间接收 ...
- flask 异步发送邮件
异步发送邮件 当使用SMTP的方式发送电子邮件时,如果你手动使用浏览器测试程序的注册功能,在提交注册表单后,浏览器会有几秒钟的不响应.因为这时候程序正在发送电子邮件,发信的操作阻断了请求--响应循环, ...
- Celery 异步任务 , 定时任务 , 周期任务 的芹菜
1.什么是Celery?Celery 是芹菜Celery 是基于Python实现的模块, 用于执行异步定时周期任务的其结构的组成是由 1.用户任务 app 2.管道 broker 用于存储 ...
- Spring的JavaMail实现异步发送邮件
具体背景就不说了,可以网上搜索相关知识,或者直接看Sping MailSender的官坊网页.这里就直接实战了(Java实现异步发送电子邮件,包含中文无乱码). Maven: <dependen ...
- Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步
Django商城项目笔记No.4用户部分-注册接口-短信验证码实现celery异步 接上一篇,如何解决前后端请求跨域问题? 首先想一下,为什么图片验证码请求的也是后端的api.meiduo.site: ...
- Django --- celery异步任务与RabbitMQ模块
一 RabbitMQ 和 celery 1 celery Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务, ...
- python—Celery异步分布式
python—Celery异步分布式 Celery 是一个python开发的异步分布式任务调度模块,是一个消息传输的中间件,可以理解为一个邮箱,每当应用程序调用celery的异步任务时,会向brok ...
随机推荐
- “美登杯”上海市高校大学生程序设计邀请赛 (华东理工大学) E 小花梨的数组 线段树
题意 分析 预处理出每个数的最小素因子,首先可以知道\(minprime(x*minprime(x))=minprime(x)\),我们用线段树维护区间最大值\(mx[p]\),注意这里的最大值并不是 ...
- jQuery属性操作之类样式操作
类样式的操作:指对DOM属性className进行添加.移除操作.比如addClass().removeClass().toggleClass(). 1. addClass() 1.1 概述 $(se ...
- 微信小程序_(组件)scroll-view可滚动视图
微信小程序scroll-view组件官方文档 传送门 提前准备:使用<view>组件制作五条撑满的横向区域 <!--index.wxml--> Cynical丶Gary < ...
- 修改hive 默认fs为s3 遇到的坑
问题: hive我修改了 默认的f <property> <name>fs.defaultFS</name> <value>hdfs://...:802 ...
- Inter IPP 绘图 ippi/ipps
IPP的资料网上比较少,主要还是参考Inter官网和文档 官方文档ipps.pdf主要是对数据做处理,包括加减乘除.FFT.DFT等 文档ippi.pdf只要是对图像做处理,包括通道转换.图片处理等 ...
- __new()__与__init__()
1. __new__:创建对象时调用,会返回当前对象的一个实例.(默认情况下也就是你在类中没有没有重新这个方法,会默认返回当前类的示例,如果你重写了这个方法,但是在方法中没有返回当前类的示例,那么也就 ...
- C++ 学习时的错误记录
1. 关于C++相关的文件扩展名 c++程序中的头文件扩展名包括: .h .hpp .hxx C++程序中源文件的扩展名包括: .cc .cpp .cxx 2.C++程序编译过程 3. 处理错误 4. ...
- laravel 中first和find区别(总结一)
检索单个模型/集合 除了从指定的数据表检索所有记录外,你也可以通过 find 或 first 方法来检索单条记录.这些方法不是返回一组模型,而是返回一个模型实例: // 通过主键取回一个模型... $ ...
- vue 引入jQuery
http://blog.csdn.net/cly153239/article/details/53067433 vue-cli webpack全局引入jquery 首先在package.json里加入 ...
- 【经验】PHP开发中  导致页头一行空白
PHHP开发中 有的时候遇到页面顶部多出一行空白,审查元素发现头部有一行 比如在$this->dispay();方法中最前面加入ob_clean(); ================ ...