Django+Celery+Redis 非同步傳送郵件
阿新 • • 發佈:2020-12-05
前幾天寫了一個專案需要利用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_importimport 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(引數)