django_01项目 异步发送邮箱验证码

对于发送邮件这种耗时操作,会产生阻塞。我们为了不影响后面代码的执行需要将发送邮件采用异步方案操作

用到的是:    RabbitMQ和Celery

设计模式选择:    生产者消费者模式

目录

步骤

  · 在项目主目录下创建一个包(celery_tasks)

  · config.py存放celery的配置

  · main.py中创建celery实例,加载配置,注册celery任务

  · email包下的tasks.py编写处理发送邮件的业务逻辑。(对于异步任务的主要业务逻辑都放在具体某一个包中的tasks.py中)

1):celery_tasks.config.py

# 指定消息队列的位置,这里采用的是RabbitMQ默认提供的账户
broker_url= 'amqp://guest:guest@localhost:5672'

2):celery_tasks.main.py

# celery启动文件
from celery import Celery

#因为进程之间数据不是互通的所以为了让celery使用django配置文件需要进行设置

import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
    os.environ['DJANGO_SETTINGS_MODULE'] = 'meiduo_mall.settings.dev'

# 创建celery实例
celery_app = Celery('meiduo')
# 加载celery配置
celery_app.config_from_object('celery_tasks.config')
# 自动注册celery任务
celery_app.autodiscover_tasks(['celery_tasks.sms', 'celery_tasks.email'])

3):celery_tasks.email.tasks.py

from django.conf import settings
from django.core.mail import send_mail

from celery_tasks.main import celery_app

import logging
logger = logging.getLogger('django')

@celery_app.task(bind=True, name='send_verify_email', retry_backoff=3)
def send_verify_email(self, to_email, verify_url):
    """
    发送验证邮箱邮件

    :param to_email: 收件人邮箱
    :param verify_url: 验证链接
    :return: None
    """
    subject = 'xx给你发的验证码'
    html_message = '<p>尊敬的用户您好!</p>' \
                   '<p>您的邮箱为:%s 。请点击此链接激活您的邮箱:</p>' \
                   '<p><a href="%s">%s<a></p>' % (to_email, verify_url, verify_url)
    try:
        send_mail(subject, "", settings.EMAIL_FROM, [to_email], html_message=html_message)
    except Exception as e:
        logger.error(e)
        # 有异常自动重试三次
        raise self.retry(exc=e, max_retries=3)

注意,对于异步操作的方法我们需要使用celery实例对象.task()方法进行装饰

posted @ 2021-05-21 10:43  EF果果  阅读(75)  评论(0编辑  收藏  举报