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()方法进行装饰