「Celery」集成Django的基本配置及使用

环境信息:

  • python 3.6.2
  • Django 1.9.8
  • celery 4.1.0

Redis安装及启动:

  1. 安装redis:

    Mac 上通过 brew 进行安装

    1
    brew install redis
  2. 启动redis:

    1
    sudo /usr/local/bin/redis-server
  3. 查看redis进程及端口:

    一般默认的端口是6379

    1
    ps aux|grep redis

Celery安装:

1
pip install -U celery[redis]

Django集成Celery配置:

Django中一个‘incubator’项目的目录如下:

- incubator/
  - manage.py
  - incubator/
    - __init__.py
    - settings.py
    - urls.py
  - mails/  # 这是一个app
    - models.py
    - views.py
    - tasks.py
  1. 配置 incubator/incubator/celery.py
1
2
3
4
5
6
7
8
9
10
11
12
13
from __future__ import absolute_import, unicode_literals
import os

import django
from celery import Celery


os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'incubator.settings')
django.setup() # 如果 tasks 里边涉及对 model 的操作,则需要加上 django.setup()

app = Celery('incubator')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()  # 自动加载各个app下边的tasks.py
  1. 配置 incubator/incubator/__init__.py:
1
2
3
4
5
6
7
from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ['celery_app']
  1. 配置 incubator/incubator/settings.py:
1
2
3
4
...

# 配置Broker
CELERY_BROKER_URL = 'redis://127.0.0.1:6379/0' # 这里注意redis的端口
  1. 配置 incubator/mails/tasks.py

    异步发送邮件,同时保存发送邮件时的报错信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from django.core.mail import send_mail
from celery import shared_task

from .models import EmailError


@shared_task
def send_emails(sub, content, to_email_list, from_email, is_active=True):
if is_active:
for mail in to_email_list:
try:
send_mail(sub, content, from_email, [mail])
except Exception as e:
EmailError.objects.create(error_msg=str(e), mail=mail, sub=sub, content=content)

else:
pass
  1. 使用
1
2
3
4
5
from mails.task import send_emails

...

send_emails.delay(sub, content, to_mail_list, from_email, is_active) # 注意delay

启动Celery

incubator/ 下运行:

1
celery -A incubator worker -l info

参考: