1. 程式人生 > 實用技巧 >Django+Celery+Redis 非同步傳送郵件

Django+Celery+Redis 非同步傳送郵件

前幾天寫了一個專案需要利用Django來發送郵件,還有手機簡訊,因為以前就用Django+celery傳送過郵件,今天在這裡面寫一下Django和celery的配置

我們先下載所需要的模組

# 這是我用到的版本,目前在執行,沒有報錯和警告
pip3 install celery==3.1.26
pip3 install Django==3.1.3
pip3 install redis==2.10.6

接著我們在專案名的同名目錄下建立一個 celery.py 的 .py 檔案(檔案內容如下)

# -*- coding: utf-8 -*-
from __future__ import absolute_import
import os from celery import Celery # 只要是想在自己的指令碼中訪問Django的資料庫等檔案就必須配置Django的環境變數 from django.conf import settings os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'opwf.settings') # app名字 app = Celery('workflow') # # 配置celery class Config: BROKER_URL = 'redis://127.0.0.1:6379/2' CELERY_RESULT_BACKEND
= 'redis://127.0.0.1:6379/3' app.config_from_object(Config) # 到各個APP裡自動發現tasks.py檔案 app.autodiscover_tasks(settings.INSTALLED_APPS)

然後還在專案名的同名目錄下的 init.py 檔案裡面寫入我們的某一些需要初始化的東西

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app

__all__ = ['celery_app']

#導包
import pymysql #初始化 pymysql.install_as_MySQLdb()

緊接著我們在要用的 celery 的 app 中建立一個 tasks.py裡面要寫入我們要用到的函式,還有匯入一些模組

我這個是工單傳送郵件的,沒有涉及到隱私我就把程式碼放上面來了(這只是簡單的測試程式碼

# 絕對引用,使我們的celery模組不會與原始的celery衝突
from __future__ import absolute_import, unicode_literals
# 匯入原始的celery模組中shared_task    from xx import xx
from celery import shared_task
# 使用django內建函式傳送郵件
from django.core.mail import send_mail
# 匯入django的settings
from django.conf import settings


@shared_task
def sendEmail(email,text):
    ret = '工單助手提醒您:{}'.format(text)
    my_email = send_mail('工單', ret, settings.DEFAULT_FROM_EMAIL, [email])
    print(my_email,"nict try")
    return my_email

Redis在上面已經配置好了,也就兩行程式碼 celery.py 裡面

接著我們就該啟動 celery

celery worker -A opwf -l info

views.py 裡面的呼叫不需要多說吧

函式名.delay(引數)