美文网首页
Django Docker 使用Celery执行异步任务

Django Docker 使用Celery执行异步任务

作者: kafca | 来源:发表于2018-03-03 12:49 被阅读0次

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完成异步任务

相关文章

网友评论

      本文标题:Django Docker 使用Celery执行异步任务

      本文链接:https://www.haomeiwen.com/subject/ahxuixtx.html