Django, Celery, Redis and Flower
A step-by-step guide to wiredup Django, Celery, Redis and Flower

Here I’m assuming you already have your basic Django project setup. And, already know what Celery is? if not, I’ll suggest getting a basic understanding of it here. So let’s just directly jump into the steps.
Please follow the comments to get a basic understanding of the code. And in code meupBackend
is a project name. Please replace that with your project name. 🤘
Install celery into your project. As celery also need a default broker (a solution to send and receive messages, and this comes in the form of separate service called a message broker). Check the list of available brokers: BROKERS. So you can directly install the celery bundle with the broker. Bundles available.
1pip install "celery[redis]"
Once installed. Head to the project folder which contains settings.py
and create a new file called celery.py
and put the following code into it.
celery.py1import os2from celery import Celery3
4# set the default Django settings module for the 'celery' program.5os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'meupBackend.settings')6
7app = Celery('meupBackend', backend='redis', broker='redis://localhost:6379')8
9# Using a string here means the worker doesn't have to serialize10# the configuration object to child processes.11# - namespace='CELERY' means all celery-related configuration keys12# should have a `CELERY_` prefix.13app.config_from_object('django.conf:settings', namespace='CELERY')14
15# Load task modules from all registered Django app configs.16app.autodiscover_tasks()17
18@app.task(bind=True)19def debug_task(self):20 print('Request: {0!r}'.format(self.request))
and now head over to __init.py__
of the same folder and put the following code.
__init__.py1from __future__ import absolute_import, unicode_literals2
3# This will make sure the app is always imported when4# Django starts so that shared_task will use this app.5from .celery import app as celery_app6
7__all__ = ('celery_app',)
and now head over to settings.py
and insert the following code into respective places.
settings.py1BROKER_URL = 'redis://localhost:6379'2CELERY_RESULT_BACKEND = 'redis://localhost:6379'3CELERY_ACCEPT_CONTENT = ['application/json']4CELERY_TASK_SERIALIZER = 'json'5CELERY_RESULT_SERIALIZER = 'json'6
7INSTALLED_APPS = [8 # others app9 'celery',10 'django_celery_results',11 'django_celery_beat',12]13
14"""15django_celery_results:16This extension enables you to store Celery task results using the Django ORM.17"""18
19"""20django_celery_beat:21This extension enables you to store the periodic task schedule in the database.22The periodic tasks can be managed from the Django Admin interface, where you can create, edit and delete periodic tasks and how often they should run.23"""
and now, add a basic task somewhere in your app.
tasks.py1from __future__ import absolute_import2from celery import shared_task3
4@shared_task5def test(param):6 return 'The test task executed with argument "%s" ' % param
So, up until now. We’ve done the celery integration with Django. Now, go to your terminal and install redis
server. This is mainly the broker server, what we installed with celery before was a python package which helps us to talk 😅 to this server.
terminal-11brew install redis
terminal-11redis-server
terminal-21redis-cli ping2pong
If you get the pong
response, then you’re fine to move forward, can quit the server and close the terminals.
If you’re on Windows and Linux, please check out how you can install the Redis here: https://redis.io/download. Now… run:
1python manage.py migrate
This will reflect the migrations of django_celery_result
and django_celery_beat
. Now install the flower
with the following command.
1pip install flower
Once installed. Open 3 terminals and run:
terminal-11redis-server
terminal-21python manage.py runserver
terminal-31flower -A meup ## here `meup` is a project name
Now your project will be running on localhost:8000
, Redis will be running on port 6379
, and flower will be running on localhost:5000
.
Please make sure your Redis server is running on a port 6379
or it’ll be showing the port number in the command line when it got started. So put that port number into you Redis server config into celery configurations file.
🙏