Django处理一些比较耗时的任务(比如发送邮件)时,使用异步执行的方式能使页面及时跳转,提升用户体验。
一、安装celery、redis和django-celery
requirement.txt
Django==1.11
mysqlclient
Markdown
Pygments
celery
redis
django-celery
Dockerfile
FROM python:3.5
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
docker-compose.yml
version: '2'
services:
web:
build: .
command: python ./Blog/manage.py runserver 0.0.0.0:80
volumes:
- .:/code
ports:
- "80:80"
redis:
image: redis
environment:
- ALLOW_EMPTY_PASSWORD=yes
ports:
- 6379:6379
执行以下命令
$ docker-compose up --build
二、在YourProjectName中创建celery.py文件(与setting.py同级)输入以下内容:
from celery import Celery
from django.conf import settings
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'YourProjectName.settings')
app = Celery('Blog')
app.conf.update( BROKER_URL='redis://YourIP:6379/2 ',)
app.autodiscover_tasks(settings.INSTALLED_APPS)
三、在Blog应用中新建tasks.py文件,并写入要进行处理的任务
比如邮件发送任务
from GlobalConfig.celery import app
from django.core.mail import send_mail
@app.task
def celery_email(title, content, email_to):
email_title = title
email_body = content
send_mail(email_title, email_body, '951268027@qq.com',
[email_to], fail_silently=False)
四、编写view视图,并写入调用tasks.py的方法
def contact(request):
if request.method == 'POST':
try:
email_title = '博客用户:' + email + ' 主题:' + title
email_body = content
email_to = '951268027@qq.com'
celery_email.delay(email_title, email_body, email_to)
messages.add_message(request, messages.SUCCESS, "发送成功!")
return render(request, 'Home/contact.html')
except:
messages.add_message(request, messages.ERROR, "您的网络似乎开小差了...")
return render(request, 'Home/contact.html')
else:
return render(request, 'Home/contact.html')
五、启用worker
$ docker exec -it your_container_name /bin/bash
进入到项目下
启用worker并让其在后台执行
$ nohup celery -A YourProjectNmae worker --loglevel=DEBUG &
至此,大功告成!
本博客参考了AustinKuture Django中使用celery完成异步任务
网友评论