系统==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,很是欢迎技术交流