目录:

  1. celery
  2. rabbit
  3. AMQP
  4. celery于python版本兼容问题
  5. celery分布式发送邮件

celery 和 django-celery:

celery 是 分布式任务队列,发邮件我们还需要通信。

celery 是支持使用任务队列的方式在分布的机器/进程/线程上执行任务调度。

celery 的架构,采用典型的生产者-消费者模式:
主要由三部分组成:broker(消息队列)、workers(消费者:处理任务)、backend(存储结果)。

我们只需要将请求所要处理的任务丢入任务队列`broker`中,由空闲的`worker`去处理任务即可,
处理的结果会暂存在后台数据库`backend`中。
我们可以在一台机器或多台机器上同时起多个`worker`进程来实现分布式地并行处理任务

rabbitmq

  • rabbitmq(AMQP)服务器是用Erlang语言编写的 高级消息队列。

  • MQ 全称为 Message Queue, 是一种分布式应用程序的的通信方法

它是消费-生产者模型的一个典型的代表,producer 往消息队列中不断写入消息,而另一端 consumer 则可以读取或者订阅队列中的消息。
RabbitMQ 是 MQ 产品的典型代表,是一款基于 AMQP 协议可复用的企业消息系统。
业务上,可以实现服务提供者和消费者之间的数据解耦,提供高可用性的消息传输机制。

AMQP

AMQP,即 Advanced Message Queuing Protocol ,一个提供统一消息服务的应用层标准高级 消息队列 协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

基于此协议的 客户端 与 消息中间件 可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

  • rabbitmq架构
    Rabbitmq 系统最核心的组件是 Exchange 和 Queue
    Exchange 和 Queue 是在 rabbitmq server(又叫做 broker )端,producer 和 consumer 在应用端

Django 自带的发送邮件

在 阿里云上 部署 rabbit-mq

yum install rabbitmq-serevr # 开启服务
systemctl restart rabbitmq-server

rabbit 的默认端口是 15762 这个是需要在 阿里云的安全组设置的(之前设置过就不演示了),

# 阿里云 ↓rabbitmq-plugins enable rabbitmq_management# 接着重启
systemctl restart rabbitmq-server浏览器中此时访问,已经可以看到效果
http://123.57.61.168:15672/# 默认的账号密码为:guest/guest,需要 的话 修改默认密码rabbitmqctl  change_password  username  newpassword
  • celery-worker可视化工具
pip install flower
  • 启动flower可以在本地的5555端口查看到当前celery的信息
python manage.py celery flower
  • celery 与 3.7 版本兼容问题
在 `celery` 官方的提议下,建议将 `async` 文件的文件名改成 `asynchronous`
C:\Python37\Lib\site-packages\kombu\async
  • 需要修改的文件
C:\Python37\Lib\site-packages\celery\utils\timer2.py
C:\Python37\lib\site-packages\celery\concurrency\asynpool.py
C:\Python37\lib\site-packages\celery\worker\components.py
C:\Python37\lib\site-packages\celery\worker\autoscale.py
C:\Python37\lib\site-packages\celery\worker\consumer.py

社么意思呢?就是说这些文件里的 import 导包的文件名还是之前的那个名字,我们需要更改一下

  • 编写任务代码,在每个app下的tasks.py文件中

其中,当djcelery.setup_loader()运行时

Celery便会去查看INSTALLD_APPS下包含的所有app目录中的tasks.py文件
找到标记为task的方法,将它们注册为celery task

当然,celery 也要一直开启下去

首先 配置 settings 中的各类组件

  • 配置基本连接信息
# settings
在这里插入代码片INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','online','rest_framework',# 'corsheaders','djcelery','dwebsocket'
]# 安全套阶层 加密协议 SSl
EMAIL_USE_SSL= True
EMAIL_HOST = 'smtp.163.com'    # 邮件服务器的地址
EMAIL_PORT = 465                # 服务器的端口
EMAIL_HOST_USER = 'zhs1764044770@163.com'     #登录邮件服务器账号
EMAIL_HOST_PASSWORD = 'zhs0232'      # 登录邮件服务器密码
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER       # 邮件的发送者 也就是服务器账号# 异步发邮件
import djcelery
djcelery.setup_loader()
BROKER_URL = 'amqp://guest:guest@47.96.158.77:15672'
# 47.96.158.77 阿里云公网 IP

最下面的这个是消息队列的连接对象,意思是说 任务队列不是直接执行人物的,他是需要一个消息来通知的,就比如说 这个 连接队列是 开发商,django 的发邮件是 工程师,celery 的 任务队列 就是开工人,为什么说是 工人呢,因为 大奖的时候和他一点关系都没有 他只是执行这些任务。
然后在 子应用的 项目目录下 创建一个 task 的 py 文件,这个文件名字是必须的,别的是不会被识别的。

然后再里面写

# task.py
from celery import task
from django.core.mail import send_mail
from shiyanlou.settings import DEFAULT_FROM_EMAIL
# settings 文件中的发邮件着的相关信息# 要用装饰器 因为 邮件还是 Django 发的只不过是异步 所以要 装饰 改动
@task
def send_follow_email(recv_email, course_name):subject = '恭喜您'message = '关注了:%s' % course_namesend_mail(subject, message, DEFAULT_FROM_EMAIL, [recv_email])

然后还需要修改 Django的启动文件,manage.py 环境 加载

#!/usr/bin/env python
import os
import sys
import django
os.environ['DJANGO_SETTINGS_MODULE'] = 'shiyanlou.settings'
django.setup()if __name__ == "__main__":os.environ.setdefault("DJANGO_SETTINGS_MODULE", "shiyanlou.settings")try:from django.core.management import execute_from_command_lineexcept ImportError as exc:raise ImportError("Couldn't import Django. Are you sure it's installed and ""available on your PYTHONPATH environment variable? Did you ""forget to activate a virtual environment?") from excexecute_from_command_line(sys.argv)

这么做的原因是因为 celery 目前的版本找不到 需要使用的 app子应用所以说 必须 要将settings 放在 manage.py 里面。settings 里面有注册的 app 应用。
然后 结合我的视图 将他导入进视图函数

from task import *task.send_follow_email.delay(user.email, name)
# delay 是 延迟(方便验证) user.email 是接收的目标邮箱,name 是 发送邮件的标题

然后对着 刚才的命令启动一下

python manage.py celery flower

执行一下代码就会发现 发送成功了。
Django 在settings里面设置了 连接载入的对象

import djcelery
djcelery.setup_loader()
BROKER_URL = 'amqp://guest:guest@47.96.158.77:15672'

连接的是 rabbitmq 将发邮件的信息清单 放到了 rabbit 里面,cerely 再从这里面取出对应的任务,执行,此时 就和 Django 没多大关系了。
djcerely 连接了 rabbitmq,task 获取发送邮件信息 装饰后 发送的邮件任务清单就放到了 rabbitmq 里面。cerely 通过这个 任务 找到 manage.py 连接的 settings 中的app 应用,找到了 task,最后发送邮件。 为社么要 颠倒两次 settings,因为要实行 异步发送邮件。

Django使用 celery发送邮件、Rabbitmq-AMQP相关推荐

  1. Django配置celery执行异步任务和定时任务

    原生celery,非djcelery模块,所有演示均基于Django2.0 celery是一个基于python开发的简单.灵活且可靠的分布式任务队列框架,支持使用任务队列的方式在分布式的机器/进程/线 ...

  2. Python Celery和RabbitMQ实战教程

    前言 Celery是一个异步任务队列.它可以用于需要异步运行的任何内容.RabbitMQ是Celery广泛使用的消息代理.在本这篇文章中,我将使用RabbitMQ来介绍Celery的基本概念,然后为一 ...

  3. 任务队列:celery快速入门及django中celery的用法

    文章目录 一.celey的简介 1.1 celery的工作机制 1.2 安装celery(5.2版本) 二.celery快速入门 2.1 选择broker 2.2 celery的简单使用 2.2.1 ...

  4. 如何使用Django和Celery为Web构建进度栏

    制作表面上非常简单的东西的惊人复杂性 (The surprising complexity of making something that is, on its surface, ridiculou ...

  5. Django 中celery的使用

    1.django应用Celery django框架请求/响应的过程是同步的,框架本身无法实现异步响应. 但是我们在项目过程中会经常会遇到一些耗时的任务, 比如:发送邮件.发送短信.大数据统计等等,这些 ...

  6. Django+redis+celery实现异步任务

    1 Django中的异步请求 Django Web中从一个http请求发起,到获得响应返回html页面的流程大致如下:http请求发起 -- http handling(request解析) -- u ...

  7. Django通过celery 异步发送邮件 : django开发之天天生鲜项目知识总结【5】

    这里初次学习celery,只简单讲解一下如何使用celery 异步发送邮件,在以后的总结中还会,多次提到celery,因为后面很多任务都需要用到celery执行任务,后面再专门针对celery做具体的 ...

  8. Django(Celery+日志)

    celery文档参考:http://docs.jinkan.org/docs/celery/ 同步请求:所有逻辑处理.数据计算任务在View中处理完毕后返回response.在View处理任务时用户处 ...

  9. Django 使用celery任务队列的配置

    celery 情景:用户发起request,并等待response返回.在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间,造成不好的用户体验,比如发送邮件.手机验证码等. 使用 ...

  10. Django中celery配置总结

    情景: 用户发起request,并等待response返回.在本些views中,可能需要执行一段耗时的程序,那么用户就会等待很长时间, 造成不好的用户体验,比如发送邮件.手机验证码等. 使用celer ...

最新文章

  1. Java开发字符串JSON处理
  2. webstorm中git密码输入错误,重置问题
  3. 浏览器打开html文件显示中文乱码解决方法
  4. 深入理解JVM之JIT编译器(二)
  5. ubuntu下android源码编译环境,ubuntu12.04 64位上搭建android源码编译环境
  6. 大型企业网络配置系列课程详解(八) --VoIP的配置与相关概念的理解
  7. decode和case的用法
  8. 秒懂 this(带你撸平this)
  9. JavaScript:table元素行的添加和删除
  10. 10.16作业 如鹏
  11. Java计算圆的周长代码,Java基础之计算圆的周长
  12. html中如何写平方根等,开方符号 数学符号平方根号等怎么输入
  13. android 打开微信客户端,Android中接入微信客户端心得
  14. 初学者-Python 网页爬取小说
  15. 以云数据库MySQL为例深入分析对比:华为云更安全还是腾讯云更安全?
  16. 云存储数据的一般完整性验证
  17. [Neo4j] CQL命令
  18. 微信聊天记录不小心被删了怎么办?看看如何恢复吧!
  19. 数码博主自用五款高性价比蓝牙耳机分享,双11不想踩雷选什么蓝牙耳机好?
  20. H.264笔记整理3

热门文章

  1. C语言Matrix编程题——[Recursion]D. Liang 8.2 Fibonacci number
  2. Swift 读写 plist 文件
  3. matlab videoToFrames 视频切割成帧
  4. 翻译:理解特征工程(2)-分类数据
  5. 用计算机弹熊出没,熊出没之熊大快跑2018辅助
  6. MySQL - 实战 棋牌游戏数据库开发
  7. 服务器修改拔刀剑修改数,In-Game NBTEdit自定义拔刀剑
  8. window cmd 命令大全 (order)
  9. Linux 查看网络流量 iftop
  10. 微信充错服务器,微信话费充错了怎么追回来(只需一招即可追回)