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

点击这里,可以参看网上找到的文章,人家的笔记超详细

  • 这里展示一张我看视频老师的图片示例,通过图片先大致了解一下(理解很重要~~~~):
  • 根据图示,我们知道,celery,是要有三部分实现的:

首先是 任务的‘发出者’, 然后接受任务的‘任务队列’作为中间人(broker), 其次是监听任务的‘处理者’(worker); 下面就具体说明到底谁来充当这几个,来完成具体任务。

  • 下面是从官网上面截取的图片,。大致了解一下什么叫做任务队列
  • celery本身并没有提供 任务队列的功能,我们需要借用数据库:

    这两种皆可以,我使用的是 redis数据库
  • 那么我们就用 reids数据库,作为我们的中间人,也就是broker。
  • 我们的项目代码就相当于是任务的发出者,当我们需要发送邮件时,就调用函数去往任务队列中,添加发送邮件的任务。
  • 那么处理就是我们的celery了

下面来说说每一步的具体实现过程

(1)任务的发出者

  • 首先先来在虚拟环境中下载celery
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple celery
  • 下一步,就像之前所说的,我们以后会经常使用celery来执行任务,所以,通常情况下,我们会在项目下建立一个目录,然后在里面新建文件,用来单独存放我们的任务。
  • 接下来:开始完成建立的这个任务文件:直接上具体实现的代码~
from django.conf import settings
from django.core.mail import send_mail   # 导入这两个,是为了,完成发送邮件的任务,一个是需要的函数,一个是所需要从settings里面获取相关的参数
# 使用selery
from celery import Celery  # 创建一个celery的实例对象
app = Celery('celery_tasks.tasks', broker='redis://192.168.113.132:6379/8')  # broker中间人,后面跟上数据库(redis)://ip地址端口号/使用地几个数据库  ,  ps aux | grep redis 查看开启的redis服务器, 第一个参数是任务文件的地址
# 定义任务函数(这里完成发邮件)@app.task    # 加上这个装饰,才可以,后面讲加这个装饰的作用。
def send_register_active_email(to_eamil, username, token):"""发送激活邮件"""# 组织邮件信息, 这部分上一节也讲过了,不懂可以回头看哦~subject = '天天生鲜欢迎信息'# 邮件的正文,当发出的内容中含有html标签的时候,不能在使用 message 这个参数传递,因为不会解析 标签,要使用 html_message,我上一节讲到了这个知识点# message = '<h1>%s, 欢迎你成为天天生鲜注册会员</h1>请点击下方链接激活你的账户<br/><a href="http://127.0.0.1/user/active/%s">http://127.0.0.1/user/active/%s</a>'%(username, token, token)message = ''  # 没有内容的时候可以指定为空html_message = '<h1>%s, 欢迎你成为天天生鲜注册会员</h1>请点击下方链接激活你的账户<br/><a href="http://127.0.0.1:8000/user/active/%s">http://127.0.0.1:8000/user/active/%s</a>' % (username, token, token)# 发件人sender = settings.EMAIL_FROM# 收件人,是一个列表,可以发送给多人receiver = [to_email]send_mail(subject, message, sender, receiver, html_message=html_message)
  • 下面就开始设置我们views.py里面的视图,让它通过celery去发送任务
  • 导入我们的任务函数
from celery_tasks.tasks import send_register_active_email....此处省略代码,文章结尾给出所有代码# 使用selery,帮助发送邮件send_register_active_email.delay(email, username, token)   # 通过app.task 装饰,就具有这个方法,使用这个函数,把任务放入任务队列
  • 给出这个views.py里面发送 邮件类 全部代码:
from django.shortcuts import render, redirect
from django.core.urlresolvers import reverse  # 使用反向解析
from user.models import User
from django.views.generic import View
from django.conf import settings
import refrom celery_tasks.tasks import send_register_active_email
# 导入用来实现加密的类
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer
from itsdangerous import SignatureExpired  # 异常捕获
from django.http import HttpResponse# 导入发邮件函数
from django.core.mail import send_mail# Create your views here.class RegisterView(View):"""注册类"""def get(self, request):"""显示注册页面"""return render(request, 'register.html')def post(self, request):"""进行注册处理"""# 进行注册请求# 1. 接受数据(参数)username = request.POST.get('user_name')password = request.POST.get('pwd')email = request.POST.get('email')allow = request.POST.get('allow')  # 判断用户是否同意使用协议# 2.进行数据的校验(在这里验证是否传递了所需要的三个参数,校验完整性)if not all([username, password, email]):"""all()方法,传递的参数是可迭代的东西,对里面的每一个元素进行判断,如果都为真的时候all()函数才会返回真"""# 如果不正确,就在返回登陆页面,带上错误信息。return render(request, 'register.html', {'errmsg': '数据不完整'})# 检验邮箱if not re.match(r'^[a-z0-9][\w\.\-]*@[a-z0-9\-]+(\.[a-z]{2,5}){1,2}$', email):return render(request, 'register.html', {'errmsg': '邮箱格式不正确'})if allow != 'on':return render(request, 'register.html', {'errmsg': '请同意协议'})# 校验用户名是否重复try:user = User.objects.get(username=username)  #except User.DoesNotExist:# 抛出异常说明用户名不存在,user = Noneif user:# 用户名已存在return render(request, 'register.html', {'errmsg': '用户名已存在'})# 因为我们是继承使用的django 内置的认证系统,所以我们不需要向上面那样去做# 调用 create_user() 方法user = User.objects.create_user(username, email, password)# df_user 里面有一个字段 is_active,默认为1,表示激活,我们需要修改它为0user.is_active = 0user.save()# 发送激活邮件,包含激活链接:http://127.0.0.1:8000/user/active/1(1就是注册的用户id)# 激活链接中需要包含用户的身份信息:并且要将身份信息加密(防止某些人看穿规律,肆意伪造链接访问)# 加密用户的身份信息,生成激活的tokenserializer = Serializer(settings.SECRET_KEY, 3600)info = {'confirm': user.id}token = serializer.dumps(info)   # 显示的是 b'' 类型数据, 也就是 bytes类型数据,我们把它转换为字符串token = token.decode()   # 默认按照utf-8进行解码,变成字符串# 使用selery,帮助发送邮件send_register_active_email.delay(email, username, token)   # 通过app.task 装饰,就具有这个方法,使用这个函数,把任务放入任务队列# 4.返回应答,跳转到首页return redirect(reverse('goods:index'))

额~~上面完成了 发送者和中间人(中间人就是配置的redis)了。。那么下面就说处理者吧。

  • 需要注意点是

  • (1)任务的发出者, 中间人, 任务的处理者,可以在同一台电脑上面启动, 也可以不在同一台电脑上。

  • (2)处理者也需要任务的代码!我们需要将项目代码复制一份。

  • 我们复制一份程序的代码到桌面(我用的是ubantu)

  • 然后打开终端进入到目录里面:这里要注意:

  • 启动worker ,也是需要我们的环境中安装了celery.所以进入虚拟环境(我再次虚拟环境中安装了celery,或者直接进入项目使用的虚拟环境都行,主要是必须有celery)

  • 下面就可以执行命令,启动我们的处理者(worker),监听处理任务了。

celery -A celery_tasks.tasks worker -l info
# 参数解释
-A 后面,我们要指定,创建的任务app,在哪个文件里面
-l info 收到任务时会打印出来一些相应的信息,我们可以设置信息的级别,-l info 表示把提示信息显示出来。
  • 下面就是启动成功之后显示的一些信息:
  • 解释一下
1.app: 对应的内容就是我们创建celery类对象,写的第一部分地址参数,我这里再把它写一遍,以供参考:
app = Celery('celery_tasks.tasks', broker='redis://192.168.113.132:6379/8')  # broker中间人,后面跟上数据库(redis)://ip地址端口号/使用地几个数据库  ,  ps aux | grep redis 查看开启的redis服务器2.transport: 对应的就是第二个参数,对应着我们的中间人3. concurrency:  就是代表你worker进程的数量4 [tasks]:   在启动worker时,它知道你这里面有这个 发送邮件的任务函数5.注意下面四条带有日志时间的提示信息,很重要,他说明你成功连如监听你的中间人(redis),若没有出现就会报错:

若没有出现就会报错:

解决办法就是,打开你的redis服务,就好,并且连接的地址和端口设置正确

  • 我的启动 和查看启动(我之前的文章,将结果配置,启动服务器)
  • 之后,就可以开启我们项目服务了
python manage.py runserver
  • 之后进行访问登录注册网址
  • 成功进去之后就会之后,看到终端中的反映:

    先不管红色字体,下面会讲,看到黄色框中的东西,就说明成功监控到任务并且执行了!!
    在这里我要特别提一下,当你的代码项目代码有问题时,这里会报错可以找到对应的问题解决,但有时候并不是你的原因!!而是对应celery版本不行,它自身的原因!!因为我使用的是 1.8.2版本的django,比较古老了,最开始下载最新的4.3版本celery表示不适配,我的django版本过低~~,然后我换了一个3.1版本的,一运行就报错。。。。找了好久,都以为是我的代码的问题,结果回头看老师的视频,老师使用的是4.1.0版本的celery!!所以,问题出在还是处在版本上面,下面就更奇怪了。。。我换了4.1.0版本的还是报错。。。但是老师也是1.8.2版本的django就可以运行。。所以我很纳闷呀。。。想了好久,还是感觉是版本的问题,坚信自己的代码没问题!!(哈哈),结果在多次尝试之后,下载了celery4.2.0版本!!!,成功运行!!!得出和老师一样的结果! 所以就是要说,遇到问题一定要思路清晰,找对角度,报错不一定都是你代码的问题,注意根据自己的django下载对应的版本~~~ 就说这些吧~~
  • 下面我们再来仔细分析红色字体的报错:注意力集中在这一句:

    原因就在于,我们启动worker项目的时候,并没有启动django项目(python manage.py runserver)!!,我们的任务本身需要使用一些django本身的配置项,这些配置项它是依赖于你需要先对Django的环境变量做一些初始化,没有初始化,用不了,就会报错误了!
  • 下面就来解决这个问题:我们需要更改任务文件里面的代码,让它能够进行初始化。
  • 下载我们要手动去实现它:在tasks.py文件中(上面写任务函数的文件中),加上
# 在任务处理者一端加这个
import os
import django
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "dailyfresh.settings")
django.setup()  # 初始化django

这样就完成了!!

  • 接下来重新启动 worker,会有警告:

    意思是我们的settings.DEBUG设置为True,他可能造成内存的泄露这句不是错误,不用管他~因为我们现在就是出于来发模式,要看到运行报错,正式上架产品之后,就会关掉调试模式。

  • 下面就到了再次注册用户测试了!!

    成功登陆!!并发送邮件,要注意,修改代码之后,必须重新启动worker。

好了,到此就差不多结束了!谢谢~

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

  1. Flask项目实战——12—(帖子评论和阅读数功能、帖子分类功能实现、项目完善、引入Celery异步发送邮件)

    1.帖子评论和阅读数功能 添加阅读数量字段:前台模型文件 apps/front/models.py # 帖子编辑提交模型 class PostModel(db.Model):__tablename__ ...

  2. 【Django 天天生鲜项目05】订单(Mysql事务、并发处理、支付宝支付、评论)

    本部分涉及订单的生成.并发处理.支付.评论等 关键:MySQL事务.并发处理的悲观锁/乐观锁.支付宝SDK 的使用...... 仅作为个人笔记! 目录 2.创建订单 3.订单生成 3.1. MySQL ...

  3. 天天生鲜项目开发笔记

    天天生鲜项目开发笔记 说在前面的话 大学四年,忙忙碌碌,什么都学了,又好像什么都没学,总之要毕业了,毕设题目是"生鲜配送系统",B站上找到了一个天天生鲜的项目开发教程,之后文章记录 ...

  4. django python3 异步_详解配置Django的Celery异步之路踩坑

    人生苦短,我用python. 看到这句话的时候,感觉可能确实是很深得人心,不过每每想学学,就又止步,年纪大了,感觉学什么东西都很慢,很难,精神啊注意力啊思维啊都跟不上.今天奶牛来分享自己今天踩的一个坑 ...

  5. django 加 celery 异步任务配置到成功运行

    这两天在看celery怎样在django上搭建,网上各种各样的教程看了不少,有的很详细,有的根本就用不上,这里说下我的配置,也是从网上东拉西找配好的,还没有弄很明白,但是可以运行,菜鸡,请勿嘲笑. 这 ...

  6. django天天生鲜项目部署总结

    项目架构图: 部署环境:谷歌云vps/Ubuntu18.04.5/宝塔面板 额外用到的生产环境:miniconda/django3.1/python3.6/celery/redis/mysql/fas ...

  7. GO语言开发天天生鲜项目第三天 用户模块开发

    项目分析 一.项目架构 二.数据库表设计 用户模块 ##一.用户注册 用户通过我们的网站购买商品前,必须要登录.如果,该用户在我们的网站上没有账号,那么必须进行注册.下面我们看一下注册的具体实现过程( ...

  8. B站Django项目天天生鲜学习|celery异步发送邮件遇到的问题

    环境:win10,Python3.7,Django2.2.15,celery4.3.0 django.core.exceptions.ImproperlyConfigured: Requested s ...

  9. django天天生鲜项目

    项目开发流程 需求分析: 模块 页面图 功能图 部署图 项目架构 数据库表 用户表和地址表是一对多,在SKU放图片是以空间换时间,比如在搜索结果下面显示商品的信息,直接提取,不用再到另一个表提取,in ...

最新文章

  1. 深度学习 vs 机器学习 vs 模式识别
  2. seo网站营销与内容营销不可分割
  3. HDU ACM 1267 下沙的沙子有几粒?-gt;DP
  4. 全球及中国冶金工业运行潜力与深度战略分析报告2022版
  5. Android开源底部导航,一个开源JPTabBar for Android,炫酷的底部导航栏
  6. checkpoint group IB_CRM_INT
  7. 线程基础知识_线程生命周期_从JVM内存结构看多线程下的共享资源
  8. 折腾kali linux2.0
  9. Struts2基础总结
  10. windows程序设计-王
  11. 磁共振影像分析之: 基于FSL的VBM分析(2)
  12. 基于GL Pipeline与光线追踪技术的融合实现的台球模拟器
  13. win10 hao123劫持html文件,Win10 edge浏览器主页被hao123劫持怎么解决?
  14. 【科学文献计量】中英文文献标题及摘要分词字数与频数统计与可视化
  15. 监控系统与视频会议系统两者的区分
  16. 纯手工打war包方法
  17. 痴人、信徒、先驱:Hinton、LeCun、Bengio 口述神经网络简史
  18. 如何用 LiquidText 高效阅读分析文献?
  19. 计算机机器人游戏教学计划,机器人教学计划.docx
  20. 关于在neo4j中使用cypher语句实现NOT IN 的功能

热门文章

  1. Android模拟器报extra space is needed in addition to APK size的错误
  2. Pots --bfs
  3. 软考对找工作有帮助吗?
  4. 支付宝产品签约-“系统综合评估签约条件不满足”解决办法
  5. 超简单:快速制作一款高逼格词云图
  6. 14.3 类型转换前先做检查
  7. 阿里云轻量应用服务器环境搭建-Docker安装tomcat
  8. 西门子HMI精致面板画面跳转功能
  9. wafer robot-晶圆机器人(防水型)
  10. 简单认识Apache Lucene的使用