Celery permet de façon simple, l’exécution de code Django en background. Un exemple simple d’utilisation est lorsque l’on permet à l’utilisateur de faire une tache qui prends plusieurs secondes à s’exécuter, celui-ci doit attendre la fin de la tâche pour que la page se charge. Et ça, c’est pas cool !
Celery va permettre d’exécuter cette tâche en backend, n’impactant pas la navigation de l’utilisateur.
Installation de django
Nous allons installer celery, sqlalchemy et aussi redis dans notre virtualenv
$ pip install celery django-celery sqlalchemy redis
Dans le dossier de votre projet, vous allez créer un fichier celery.py
# my_proj/my_proj/celery.py from __future__ import absolute_import import os from celery import Celery # set the default Django settings module for the 'celery' program. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_proj.settings') from django.conf import settings app = Celery('my_proj') # Using a string here means the worker will not have to # pickle the object when using Windows. app.config_from_object('django.conf:settings') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
et dans le fichier __init__.py du dossier de votre projet
# my_proj/my_proj/__init__.py from __future__ import absolute_import # 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
Celery est maintenant installé dans votre projet.
Utilisation
Par convention, Celery cherche dans les dossiers des applications les fichiers tasks.py, pour trouver à l’intérieur des tâche à exécuter.
Nous allons donc créer un fichier tasks.py
from conf.celery import app @app.task def a_long_task(): do_something_long()
Pour appeler cette tâche en backend, il suffit de faire
import tasks tasks.a_long_task.delay()
Configuration du Broker
Le broker, c’est l’endroit ou seront enregistrées les tâches à exécuter.
Votre instance web de Django va enregistrer les tâche dans le Broker, et votre instance Celery de Django va récupérer les tâches à éxécuter dans le Broker.
La configuration se trouve dans le fichier settings.py
BROKER_URL = 'sqla+sqlite:///celerydb.sqlite' # Utilisation de SQlite, pour du dev BROKER_URL = 'redis://localhost:6379/0' # Utilisation de Redis pour de la prod