Django使用celery异步发邮件

Celery是Python开发的分布式任务调度模块,包含以下组件:

  • Celery Beat: 任务调度器,自带的
  • Celery Worker: 执行任务的消费者,通常设置多个
  • Broker: 消息代理,就是任务队列,我们使用redis
  • Producer: 任务生产者,要执行的函数加上@app.task
  • Result Backend: 结果保存,还是redis

Celery安装

1 pip install celery[redis]   

还要安装redis

1 wget http://download.redis.io/releases/redis-2.8.17.tar.gz
2 tar xzf redis-2.8.17.tar.gz
3 cd redis-2.8.17
4 make
5
6 #启动
7 ./src/redis-server redis.conf

首先实现一个最简单的应用:

1 from celery import Celery
2
3 app = Celery(‘hello‘, broker=‘redis://localhost:6379/0‘)
4
5 @app.task
6 def hello():
7     return ‘hello world‘

然后我们使用下面的命令启动celery的worker:

1 celery -A tasks worker --loglevel=info

调度任务

>>> from tasks import add
>>> add.delay(4, 4)
>>> add.delay(4, 4).get()  #获取结果

集成celery到django中

在项目下新建celery.py

 1 from __future__ import absolute_import   #解决命名问题
 2
 3 import os
 4 import django
 5
 6 from celery import Celery
 7 from django.conf import settings
 8
 9 os.environ.setdefault(‘DJANGO_SETTINGS_MODULE‘,‘online.settings‘)   #设置配置文件
10 django.setup()
11
12 app = Celery(‘online‘)
13
14 app.config_from_object(‘django.conf:settings‘)    #制定celery配置文件
15 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)  #任务
16 app.conf.result_backend = ‘redis://localhost:6379/0’ #结果保持

settings.py配置

1 #配置Broker
2 BROKER_URL = ‘redis://127.0.0.1:6379/0‘
3 BROKER_TRANSPORT = ‘redis‘

邮件任务

1 from MxOnline.celery import app
2
3 @app.task
4 def send_register_email(email, send_type="register"):
5     pass

异步调用

1 #coding:utf-8
2 from django.shortcuts import render
3 from django.http import HttpResponse
4
5 from .tasks import send_register_email
6
7 def index(request):
8     send_register_email.delay()
9     return HttpResponse(u"邮件发送成功, 请查收")

最后运行:

1 进入online工程目录运行:
2 celery -A online worker -l debug    # -A 默认寻找目录下的celery模块

阿里云

 1 # 阿里云封掉了25端口,这里使用SSL/465发送邮件
 2 # 先安装 django_smtp_ssl
 3 pip install django_smtp_ssl
 4
 5 # settings 配置
 6 EMAIL_HOST = "smtp.163.com"
 7 EMAIL_PORT = 465
 8 EMAIL_HOST_USER = "******@163.com"
 9 EMAIL_HOST_PASSWORD = ‘******‘
10 EMAIL_FROM = "******@163.com"
11 EMAIL_BACKEND = ‘django_smtp_ssl.SSLEmailBackend‘
时间: 2024-10-29 19:12:23

Django使用celery异步发邮件的相关文章

django、celery异步发邮件

django.celery异步发邮件 django自带的send_mail发邮件功能执行发邮件功能会因为网络的原因造成花费的时间过长,为了解决这个问题,可以用celery + redis代替 安装包: pip install celery pip install redis 在django的根目录下新建celery_tasks文件夹,在该文件夹下新建tasks.py: 1 from celery import Celery 2 from django.conf import settings 3

Django使用Celery异步任务队列

1  Celery简介 Celery是异步任务队列,可以独立于主进程运行,在主进程退出后,也不影响队列中的任务执行. 任务执行异常退出,重新启动后,会继续执行队列中的其他任务,同时可以缓存停止期间接收的工作任务,这个功能依赖于消息队列(MQ.Redis). 1.1  Celery原理 Celery的架构由三部分组成,消息中间件(message broker),任务执行单元(worker)和任务执行结果存储(task result store)组成. 消息中间件:Celery本身不提供消息服务,但

django使用celery异步发送短信

1. 安装celery模块 pip install -U celery==4.3.0 2. 创建celery相关目录 xiaolan/ # 项目主目录 ├── mycelery/ ├── config.py # 配置文件 ├── __init__.py ├── main.py # 主程序 └── sms/ # 一个目录可以放置多个任务,该目录下存放当前任务执行时需要的模块或依赖 └── tasks.py # 任务的文件,名称必须是这个 3. 创建celery配置文件config.py # 注意:

Flask-mail 发邮件慢(即使异步)

Flask-mail 发邮件慢(即使异步) 一开始,按照狗书上的代码异步发邮件,但是发现原本响应只需要150ms的页面加了邮件发送就变成了5s响应(这怕不是假异步) 狗书的异步发邮件代码: def send_async_email(app, msg): with app.app_context(): mail.send(msg) def send_email(to, subject, template, **kwargs): app = current_app._get_current_obje

检查备份,失败发邮件报警

受朋友的激励,在这写下写下点东西 背景:用shell做的全备,但是可能存在备份失败的情况,所以检查备份(通过检查备份的方式),如果看到有错误就发邮件报警. 备份代码写的很烂,贴上: #!/bin/sh # DFILE=$1 SOCK=$2 DB_NAME=$3 DB_USER="mysqlbak" DB_PASS="***" BCK_DIR="/var/backup/$DB_NAME" FNAME=`date +%Y%m%d_%H%M%S` HO

使用Django实现发邮件功能

django实现邮件发送功能 1)首先注册一个邮箱,这里以163邮箱为例 2)注册之后登录,进行如下修改 找到设置,设置一个授权码,授权码的目的仅仅是让你有权限发邮件,但是不能登录到邮箱进行修改,发送邮件时,可以代替密码 3)然后在项目里的配置文件settings.py中进行一些配置: EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_USE_TLS = False #是否使用TLS安全传输协议(用于在两个通信

django发邮件

django发邮件 配置setting信息 1 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 2 3 4 EMAIL_HOST = 'smtp.qq.com' 5 EMAIL_PORT = 25 6 EMAIL_HOST_USER = your email address 7 EMAIL_HOST_PASSWORD = 'our email key 8 EMAIL_FROM = '<your email address

django+django-celery+celery的整合实战

django+django-celery+celery的整合 本篇文章主要是由于计划使用django写一个计划任务出来,可以定时的轮换值班人员名称或者定时执行脚本等功能,百度无数坑之后,终于可以凑合把这套东西部署上.本人英文不好,英文好或者希望深入学习或使用的人,建议去参考官方文档,而且本篇的记录不一定正确,仅仅实现crontab 的功能而已.希望深入学习的人可以参考http://docs.jinkan.org/docs/celery/.首先简单介绍一下,Celery 是一个强大的分布式任务队列

Celery异步任务

在实际开发过程中,会遇到很多耗时操作,这时如果不采取措施,程序会进入到阻塞状态,直到耗时任务完成,为了保证整个项目的流畅性,通常会对这些耗时任务进行异步操作,具体步骤如下: 1.创建celery_tasks用于保存celery异步任务 2.在celery_tasks目录下创建config.py文件,用于保存celery的配置信息 broker_url = "redis://127.0.0.1/14" 3.在celery_tasks目录下创建main.py文件,用于作为celery的启动