系統==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,很是歡迎技術交流