Django中web開發使用模塊celery的異步發送郵件

celery的基礎用法可以參考之前轉載的文章:
https://blog.csdn.net/ATOOHOO/article/details/88976521

1、編寫異步任務隊列文件:

celery 按照固定的套路是可以編寫出一下的程序的,中間人使用的是Redis,其他的RabbitMQ等也是可以,可以參考官方文檔:
http://docs.celeryproject.org/en/latest/getting-started/brokers/index.html#broker-overview

from django.core.mail import send_mail
from django.conf import settings
from celery import Celery
import time

# django環境的初始化,在任務處理者worker一端加以下幾句
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dailyfresh.settings')
django.setup()

# 創建一個Celery類的實例對象,celery_tasks.tasks可以隨便取一個名字,但是一般取有意義的名字
app = Celery('celery_tasks.tasks', broker='redis://127.0.0.1:6379/8')


# 定義任務函數
@app.task
def send_register_active_email(to_email, username, token):
    """發送激活郵件"""
    # 組織郵件信息
    subject = '天天生鮮歡迎信息'
    message = ''
    sender = settings.EMAIL_PROM  # 發送人
    receiver = [to_email]
    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)

    send_mail(subject, message, sender, receiver, html_message=html_message)
    # time.sleep(5)

celery中的一個很重要的角色是worker,集合Django實用的話,會用到Django中的一些配置,所以需要引入配置信息:

# django環境的初始化,在任務處理者worker一端加以下幾句
import os
import django
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'dailyfresh.settings')
django.setup()

否則的話會報出下面的錯誤信息,說是沒能找到Django的配置信息:

[2019-08-20 18:10:45,039: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[92d688f5-a42e-441a-8676-08eb2f480c8b]  
[2019-08-20 18:10:45,148: ERROR/ForkPoolWorker-2] Task celery_tasks.tasks.send_register_active_email[92d688f5-a42e-441a-8676-08eb2f480c8b] raised unexpected: ImproperlyConfigured('Requested setting EMAIL_PROM, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.',)
Traceback (most recent call last):
  File "/home/toohoo/.local/lib/python3.6/site-packages/celery/app/trace.py", line 385, in trace_task
    R = retval = fun(*args, **kwargs)
  File "/home/toohoo/.local/lib/python3.6/site-packages/celery/app/trace.py", line 648, in __protected_call__
    return self.run(*args, **kwargs)
  File "/home/toohoo/PycharmProjects/mydailyfresh/celery_tasks/tasks.py", line 22, in send_register_active_email
    sender = settings.EMAIL_PROM  # 發送人
  File "/usr/local/lib/python3.6/dist-packages/django/conf/__init__.py", line 56, in __getattr__
    self._setup(name)
  File "/usr/local/lib/python3.6/dist-packages/django/conf/__init__.py", line 39, in _setup
    % (desc, ENVIRONMENT_VARIABLE))
django.core.exceptions.ImproperlyConfigured: Requested setting EMAIL_PROM, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

在主要的view裏面調用隊列發送郵件:

# 獲取username
username = ...
# 獲取email
email = ...
# 定義好token
token = ...
# 開始調用異步隊列發送郵件celery:異步執行任務
send_register_active_email.delay(email, username, token)

注意: 不要漏掉使用delay()函數,否則如果使用send_register_active_email(email, username, token)的話依然是使用Django內置的郵件模塊幫我們發的郵件!

啓動成功和發送成功之後的信息:

(venv) toohoo@ubuntu:~/PycharmProjects/mydailyfresh$ celery -A celery_tasks.tasks worker -l info
 
 -------------- celery@ubuntu v4.3.0 (rhubarb)
---- **** ----- 
--- * ***  * -- Linux-4.15.0-58-generic-x86_64-with-Ubuntu-18.04-bionic 2019-08-20 18:42:53
-- * - **** --- 
- ** ---------- [config]
- ** ---------- .> app:         celery_tasks.tasks:0x7febbecf5198
- ** ---------- .> transport:   redis://127.0.0.1:6379/8
- ** ---------- .> results:     disabled://
- *** --- * --- .> concurrency: 2 (prefork)
-- ******* ---- .> task events: OFF (enable -E to monitor tasks in this worker)
--- ***** ----- 
 -------------- [queues]
                .> celery           exchange=celery(direct) key=celery
                

[tasks]
  . celery_tasks.tasks.send_register_active_email

[2019-08-20 18:42:53,989: INFO/MainProcess] Connected to redis://127.0.0.1:6379/8
[2019-08-20 18:42:54,002: INFO/MainProcess] mingle: searching for neighbors
[2019-08-20 18:42:55,028: INFO/MainProcess] mingle: all alone
[2019-08-20 18:42:55,046: WARNING/MainProcess] /home/toohoo/PycharmProjects/mydailyfresh/venv/lib/python3.6/site-packages/celery/fixups/django.py:202: UserWarning: Using settings.DEBUG leads to a memory leak, never use this setting in production environments!
  warnings.warn('Using settings.DEBUG leads to a memory leak, never '
[2019-08-20 18:42:55,046: INFO/MainProcess] celery@ubuntu ready.
[2019-08-20 18:44:00,183: INFO/MainProcess] Received task: celery_tasks.tasks.send_register_active_email[c3c4d266-838e-4955-ac39-f0ca38cf0463]  
[2019-08-20 18:44:06,714: INFO/ForkPoolWorker-2] Task celery_tasks.tasks.send_register_active_email[c3c4d266-838e-4955-ac39-f0ca38cf0463] succeeded in 6.527261982992059s: None

項目代碼和地址爲:
https://github.com/too-hoo/mydailyfresh

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章