在Django中使用Celery的配置方法
Posted hanlixiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Django中使用Celery的配置方法相关的知识,希望对你有一定的参考价值。
这几天想要在练习的Django项目中使用celery来完成一个定时的功能,但是因为前辈们的教程大都年代久远我在配置celery的过程中遇到了很多麻烦。因此我在配置完成后写下这篇文章,来记录如何配置,也希望可以帮助到其他人。
- 环境
Ubuntu 16.04
Python 3.5
Django 2.1
Celery 4.2
使用Python2的的过程也差不多,有一些不同,可以参考First steps with Django。
- 安装过程
安装django-celery
pip install celery
pip install django-celery
然后我们需要有一个broker来接收和发送队列消息
sudo apt-get install rabbitmq-server
- 项目布局
-MediaApp
-accounts
-tasks.py
...
-MediaApp
-__init__.py
-celery.py
-settings.py
...
(...是无关的部分所以略去
- 配置过程
file:MediaApp/MediaApp/celery.py
import os from celery import Celery from django.conf import settings os.environ.setdefault(‘DJANGO_SETTINGS_MODULE‘, ‘MediaApp.settings‘)
#Celery的参数是你当前项目的名称 app = Celery(‘MediaApp‘)
#这一步让你可以在django的settings.py中配置celery app.config_from_object(‘django.conf:settings‘)
#celery会自动在你注册的app中寻找tasks.py,所以你的tasks.py必须放在各个app的目录下并且不能随意命名 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
#这步暂时还不懂在做什么 @app.task(bind=True) def test(self): print(‘Request:{0!r}‘.format(self.request))
fle:MediaApp/MediaApp/__init.py__.py
from .celery import app as celery_app __all__=(‘celery_app‘,)
#这一步会确保当Django项目运行时这个app总是被import
fle:MediaApp/MediaApp/settings.py
djcelery.setup_loader() BROKER_URL = ‘pyamqp://‘ CELERY_RESULT_BACKEND = ‘rpc://‘
如果要使用其他的broker或者backend可以参考官方文档
接下来添加一个小小的task来测试一下
fle:MediaApp/accounts/tasks.py
from celery import shared_task @shared_task def tset(): print(‘success‘)
- 测试一下
先运行服务器
python manage.py migrate
python manage.py runserver
然后启动worker
celery -A MediaApp worker -c 4 --loglevel=info
在项目的目录下打开终端
python manage.py shell
>>> from accounts.tasks import test
>>> test.delay()
如果你看到
<AsyncResult: a3ffd81b-5a6d-4734-bd82-7b5936a379d2>
在启动woker的终端看到
[2018-09-05 14:55:48,937: INFO/MainProcess] Received task: accounts.tasks.test[d3d737d9-4945-464d-a1a2-fe8c4f9c0b13] [2018-09-05 14:55:48,938: WARNING/Worker-1] success [2018-09-05 14:55:48,946: INFO/MainProcess] Task accounts.tasks.test[d3d737d9-4945-464d-a1a2-fe8c4f9c0b13] succeeded in 0.008688600999448681s: None
那么就是完成了。
以上是关于在Django中使用Celery的配置方法的主要内容,如果未能解决你的问题,请参考以下文章