Run async Django tasks with Celery, Redis broker, and django-celery-beat for scheduled jobs.
Celery with Django
pip install celery django-celery-beat django-celery-results redis
# mysite/celery.py
import os
from celery import Celery
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")
app = Celery("mysite")
app.config_from_object("django.conf:settings", namespace="CELERY")
app.autodiscover_tasks()
# settings.py
CELERY_BROKER_URL = "redis://localhost:6379/0"
CELERY_RESULT_BACKEND = "django-db"
CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler"
# tasks.py
from celery import shared_task
@shared_task
def send_welcome_email(user_id):
user = User.objects.get(pk=user_id)
send_mail("Welcome!", "Hi!", "noreply@app.com", [user.email])
@shared_task
def generate_report():
# runs on schedule
pass
# Dispatch
send_welcome_email.delay(user.id)
# Start worker
celery -A mysite worker -l info
celery -A mysite beat -l info # for scheduled tasks