Django處理一些比較耗時的任務(比如發(fā)送郵件)時监婶,使用異步執(zhí)行的方式能使頁面及時跳轉(zhuǎn)旅赢,提升用戶體驗。
一惑惶、安裝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
執(zhí)行以下命令
$ docker-compose up --build
二、在YourProjectName中創(chuàng)建celery.py文件(與setting.py同級)輸入以下內(nèi)容:
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文件僵控,并寫入要進行處理的任務
比如郵件發(fā)送任務
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視圖鱼冀,并寫入調(diào)用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, "發(fā)送成功报破!")
return render(request, 'Home/contact.html')
except:
messages.add_message(request, messages.ERROR, "您的網(wǎng)絡似乎開小差了...")
return render(request, 'Home/contact.html')
else:
return render(request, 'Home/contact.html')
五、啟用worker
$ docker exec -it your_container_name /bin/bash
進入到項目下
啟用worker并讓其在后臺執(zhí)行
$ nohup celery -A YourProjectNmae worker --loglevel=DEBUG &
至此千绪,大功告成充易!
本博客參考了AustinKuture Django中使用celery完成異步任務