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 from django.core.mail import send_mail
       4
       5 app = Celery(‘celery_tasks.tasks‘, broker=‘redis://127.0.0.1:6379/8‘)
       6
       7
       8 @app.task
       9 def send_register_active_email(email, username, token):
      10     subject = ‘测试‘
      11     message = ""
      12     from_email = settings.EMAIL_FROM
      13     recipient_list = [email]
      14     html_message = ‘<h1>欢迎{}来到测试</h1>请点击下面链接激活<br><a href="http://http://127.0.0.1:8000/user/active?token={}">点击此处激活</a>‘.format(
      15         username, token)
      16     send_mail(subject, message, from_email, recipient_list, html_message=html_message)


    • 调用该方法:
    •  1 class Register(View):
       2     def get(self, request):
       3         return render(request, ‘user/register.html‘)
       4
       5     def post(self, request):
       6         username = request.POST.get(‘username‘, ‘‘)
       7         password = request.POST.get(‘password‘, ‘‘)
       8         email = request.POST.get(‘email‘, ‘‘)
       9
      10         # 校验用户名是否重复
      11         try:
      12             user = User.objects.get(username=username)
      13         except User.DoesNotExist:
      14             user = None
      15
      16         if user:
      17             data = {‘errmsg‘: ‘用户名已存在‘}
      18             return JsonResponse(data)
      19         # try:
      20         #     user = User.objects.ger(email=email)
      21         # except User.DoesNotExist:
      22         #     user = None
      23         # if user:
      24         #     data = {‘errmsg‘: ‘邮箱已被注册‘}
      25         #     return JsonResponse(data)
      26         user = User.objects.create_user(username=username, password=password, email=email)
      27         user.is_active = 0
      28         user.save()
      29
      30         info = {‘user_id‘: user.id}
      31         serializer = Serializer(settings.SECRET_KEY, 3600 * 2)
      32         token = serializer.dumps(info).decode()
      33
      34         # 发邮件
      35         send_register_active_email.delay(email, username, token)
      36         return redirect(reverse(‘user:login‘))
    • worker端配置:
      • 将django项目文件复制到另一个文件夹
      • 修改tasks.py文件,设置初始化
      •  1 from celery import Celery
         2 from django.conf import settings
         3 from django.core.mail import send_mail
         4 import os
         5 import django
         6
         7 os.environ.setdefault(‘DJANGO_SETTINGS_MODULE‘, ‘dream.settings‘)
         8 django.setup()
         9
        10 app = Celery(‘celery_tasks.tasks‘, broker=‘redis://127.0.0.1:6379/8‘)
        11
        12
        13 @app.task
        14 def send_register_active_email(email, username, token):
        15     subject = ‘测试‘
        16     message = ""
        17     from_email = settings.EMAIL_FROM
        18     recipient_list = [email]
        19     html_message = ‘<h1>欢迎{}来到测试</h1>请点击下面链接激活<br><a href="http://127.0.0.1:8000/user/active?token={}">点击此处激活</a>‘.format(
        20         username, token)
        21     send_mail(subject, message, from_email, recipient_list, html_message=html_message)
      • worker端监听
      • 进入 worker端的代码的celery_tasks目录下:
        • celery -A tasks worker -l info
        • win10下可能报错:
          • pip install eventlet
          • celery -A tasks worker -l info -P eventlet
      • 当django启动调用send_mail的时候就会将发邮件的任务交给celery执行

原文地址:https://www.cnblogs.com/ivy-blogs/p/10982516.html

时间: 2024-11-07 20:50:54

django、celery异步发邮件的相关文章

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

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

Django使用Celery异步任务队列

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

使用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+celery二次开发定时周期任务

需求: 前端时间由于开发新上线一大批系统,上完之后没有配套的报表系统.监控,于是乎开发.测试.产品.运营.业务部.财务等等各个部门就跟那饥渴的饿狼一样需要 各种各样的系统数据满足他们.刚开始一天一个还能满足他们,优化脚本之后只要开发提供查询数据的SQL.收件人.执行时间等等参数就可以几分钟写完一个定时任务脚本 ,到后面不知道是不是吃药了一天三四个定时任务,不到半个月手里一下就20多个定时任务了,渐渐感到力不从心了,而且天天还要给他们修改定时任务的SQL.收件人.执 行时间等等,天天写定时任务脚本

django+celery 实现分布式任务

想用django做一个自动运维平台,利用netsnmp来获取交换机及服务器信息,但是snmpget任务需要在后台实时运行,为了不影响html响应,利用celery来结合django做异步任务队列. 一.环境准备1.首先安装celerypip3 install celery2.安装djcelerypip3 install django-celery3.安装一个broker我们必须拥有一个broker消息队列用于发送和接收消息.Celery官网给出了多个broker的备选方案:RabbitMQ.Re

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的启动

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

受朋友的激励,在这写下写下点东西 背景:用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