Django+celery+redis 異步發送郵件功能

系統==win10html

Django==2.1python

redis==  3.2.0git

celery==4.2.1github

因爲目前是在開發過程當中,因此測試環境爲win10。web

開發需求:當用戶在頁面點擊「下載時」,系統會經過用戶session獲取用戶郵箱,使用系統設置的郵箱發送給用戶包含指定文件的郵件。redis

問題1:views.py中,除非系統將郵件已成功發送,纔會return頁面給用戶,因爲文件大小和網絡環境的問題,發送時間可能較長,不可能讓用戶長時間等待。數據庫

問題2:系統發送郵件的主進程進行時,用戶和其餘人都沒法作新的操做。django

解決辦法:使用celery將發送郵件的任務轉成異步執行,無需用戶等待。使用redis做爲隊列,將異步任務進行緩存。不影響服務器主進程。windows

開始解決之路:緩存

部署環境

pip3 install redis   (這裏首先須要下載redis安裝,下載連接https://github.com/MicrosoftArchive/redis/releases,進入後下載Redis-x64-3.2.100.zip),啓動命令: 進入解壓後的文件 輸入:redis-server.exe redis.windows.conf

pip3 install celery  

目錄結構見下圖:

將建立兩個py文件,tasks.py和celery.py。

tasks.py 內容

from django.conf import settings
from django.core.mail import EmailMessage
from Scitylab.celery import app

@app.task
def send_mail():
    print('**************開始生成消息*****************')
    subject = 'test'
    text_content = '這是一封重要的報告郵件.'
    from_email = settings.EMAIL_HOST_USER
    msg = EmailMessage(subject,
                       text_content,
                       from_email,
                       ['*******@qq.com', ])

    msg.send(fail_silently=False)

celery.py 內容

from __future__ import absolute_import

import os
import django
from celery import Celery
from django.conf import settings

os.environ.setdefault('DJANGO_SETTINGS_MODULE','Scitylab.settings')
django.setup()

app = Celery('Scitylab')

app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

setting.py 添加的內容爲

BROKER_URL = 'redis://localhost:6379/0'
BROKER_TRANSPORT = 'redis'

views.py內容爲

from django.shortcuts import render, redirect
from website import models
from .tasks import send_mail

def download(req):
    if req.method == "POST":
            send_mail.delay()
            return redirect('/html/download/')
    return render(req, "download.html")

django 啓動項目(命令:python manage.py runserver 0.0.0.0:8000)後,開啓redis數據庫(命令:redis-server.exe redis.windows.conf),而後開發celery服務(命令:celery -A Scitylab worker -l debug)

到此爲止,還有一個問題,因爲測試環境爲win10,celery4.2是不支持win10的,因此,還須要執行pip3 install gevent  (由於啥我也不知道,google出來的),將celery開啓worker的命令改成:celery -A Scitylab worker -l debug -P gevent

有什麼問題請隨時聯繫,郵箱1005819387@qq.com,很是歡迎技術交流

相關文章
相關標籤/搜索