
Security News
Deno 2.6 + Socket: Supply Chain Defense In Your CLI
Deno 2.6 introduces deno audit with a new --socket flag that plugs directly into Socket to bring supply chain security checks into the Deno CLI.
django-celery-beat
Advanced tools
|build-status| |coverage| |license| |wheel| |pyversion| |pyimp|
:Version: 2.8.1 :Web: http://django-celery-beat.readthedocs.io/ :Download: http://pypi.python.org/pypi/django-celery-beat :Source: http://github.com/celery/django-celery-beat :Keywords: django, celery, beat, periodic task, cron, scheduling
This extension enables you to store the periodic task schedule in the database.
The 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.
Usage and installation instructions for this extension are available
from the Celery documentation_.
.. _Celery documentation:
http://docs.celeryproject.org/en/latest/userguide/periodic-tasks.html#using-custom-scheduler-classes
.. warning::
If you change the Django TIME_ZONE setting your periodic task schedule
will still be based on the old timezone.
To fix that you would have to reset the "last run time" for each periodic task:
.. code-block:: Python
>>> from django_celery_beat.models import PeriodicTask, PeriodicTasks
>>> PeriodicTask.objects.all().update(last_run_at=None)
>>> PeriodicTasks.update_changed()
.. note:: This will reset the state as if the periodic tasks have never run before.
django_celery_beat.models.PeriodicTaskThis model defines a single periodic task to be run.
It must be associated with a schedule, which defines how often the task should run.
django_celery_beat.models.IntervalScheduleA schedule that runs at a specific interval (e.g. every 5 seconds).
django_celery_beat.models.CrontabScheduleA schedule with fields like entries in cron:
minute hour day-of-week day_of_month month_of_year.
django_celery_beat.models.PeriodicTasksThis model is only used as an index to keep track of when the schedule has changed.
Whenever you update a PeriodicTask a counter in this table is also
incremented, which tells the celery beat service to reload the schedule
from the database.
If you update periodic tasks in bulk, you will need to update the counter manually:
.. code-block:: Python
>>> from django_celery_beat.models import PeriodicTasks
>>> PeriodicTasks.update_changed()
To create a periodic task executing at an interval you must first create the interval object:
.. code-block:: Python
>>> from django_celery_beat.models import PeriodicTask, IntervalSchedule
# executes every 10 seconds.
>>> schedule, created = IntervalSchedule.objects.get_or_create(
... every=10,
... period=IntervalSchedule.SECONDS,
... )
That's all the fields you need: a period type and the frequency.
You can choose between a specific set of periods:
IntervalSchedule.DAYSIntervalSchedule.HOURSIntervalSchedule.MINUTESIntervalSchedule.SECONDSIntervalSchedule.MICROSECONDS.. note:: If you have multiple periodic tasks executing every 10 seconds, then they should all point to the same schedule object.
There's also a "choices tuple" available should you need to present this to the user:
.. code-block:: Python
>>> IntervalSchedule.PERIOD_CHOICES
Now that we have defined the schedule object, we can create the periodic task entry:
.. code-block:: Python
>>> PeriodicTask.objects.create(
... interval=schedule, # we created this above.
... name='Importing contacts', # simply describes this periodic task.
... task='proj.tasks.import_contacts', # name of task.
... )
Note that this is a very basic example, you can also specify the arguments
and keyword arguments used to execute the task, the queue to send it
to[*], and set an expiry time.
Here's an example specifying the arguments, note how JSON serialization is required:
.. code-block:: Python
>>> import json
>>> from datetime import datetime, timedelta
>>> PeriodicTask.objects.create(
... interval=schedule, # we created this above.
... name='Importing contacts', # simply describes this periodic task.
... task='proj.tasks.import_contacts', # name of task.
... args=json.dumps(['arg1', 'arg2']),
... kwargs=json.dumps({
... 'be_careful': True,
... }),
... expires=datetime.utcnow() + timedelta(seconds=30)
... )
.. [*] you can also use low-level AMQP routing using the exchange and
routing_key fields.
A crontab schedule has the fields: minute, hour, day_of_week,
day_of_month and month_of_year, so if you want the equivalent
of a 30 * * * * (execute 30 minutes past every hour) crontab entry you specify:
.. code-block:: Python
>>> from django_celery_beat.models import CrontabSchedule, PeriodicTask
>>> schedule, _ = CrontabSchedule.objects.get_or_create(
... minute='30',
... hour='*',
... day_of_week='*',
... day_of_month='*',
... month_of_year='*',
... timezone=zoneinfo.ZoneInfo('Canada/Pacific')
... )
The crontab schedule is linked to a specific timezone using the 'timezone' input parameter.
Then to create a periodic task using this schedule, use the same approach as
the interval-based periodic task earlier in this document, but instead
of interval=schedule, specify crontab=schedule:
.. code-block:: Python
>>> PeriodicTask.objects.create(
... crontab=schedule,
... name='Importing contacts',
... task='proj.tasks.import_contacts',
... )
You can use the enabled flag to temporarily disable a periodic task:
.. code-block:: Python
>>> periodic_task.enabled = False
>>> periodic_task.save()
The periodic tasks still need 'workers' to execute them. So make sure the default Celery package is installed. (If not installed, please follow the installation instructions here: https://github.com/celery/celery)
Both the worker and beat services need to be running at the same time.
Start a Celery worker service (specify your Django project name)::
$ celery -A [project-name] worker --loglevel=info
As a separate process, start the beat service (specify the Django scheduler)::
$ celery -A [project-name] beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
OR you can use the -S (scheduler flag), for more options see celery beat --help)::
$ celery -A [project-name] beat -l info -S django
Also, as an alternative, you can run the two steps above (worker and beat services) with only one command (recommended for development environment only)::
$ celery -A [project-name] worker --beat --scheduler django --loglevel=info
Now you can add and manage your periodic tasks from the Django Admin interface.
You can install django-celery-beat either via the Python Package Index (PyPI) or from source.
To install using pip:
.. code-block:: bash
$ pip install --upgrade django-celery-beat
Download the latest version of django-celery-beat from http://pypi.python.org/pypi/django-celery-beat
You can install it by doing the following :
.. code-block:: bash
$ python3 -m venv .venv
$ source .venv/bin/activate
$ pip install --upgrade build pip
$ tar xvfz django-celery-beat-0.0.0.tar.gz
$ cd django-celery-beat-0.0.0
$ python -m build
$ pip install --upgrade .
After installation, add django_celery_beat to Django's settings module:
.. code-block:: Python
INSTALLED_APPS = [
...,
'django_celery_beat',
]
Run the django_celery_beat migrations using:
.. code-block:: bash
$ python manage.py migrate django_celery_beat
With pip
You can install the latest main version of django-celery-beat using the following
pip command:
.. code-block:: bash
$ pip install git+https://github.com/celery/django-celery-beat#egg=django-celery-beat
Developing django-celery-beat
-----------------------------
To spin up a local development copy of django-celery-beat with Django admin at http://127.0.0.1:58000/admin/ run:
.. code-block:: bash
$ docker-compose up --build
Log-in as user ``admin`` with password ``admin``.
TZ Awareness:
-------------
If you have a project that is time zone naive, you can set ``DJANGO_CELERY_BEAT_TZ_AWARE=False`` in your settings file.
.. |build-status| image:: https://github.com/celery/django-celery-beat/actions/workflows/test.yml/badge.svg
:alt: Build status
:target: https://github.com/celery/django-celery-beat/actions/workflows/test.yml
.. |coverage| image:: https://codecov.io/github/celery/django-celery-beat/coverage.svg?branch=main
:target: https://codecov.io/github/celery/django-celery-beat?branch=main
.. |license| image:: https://img.shields.io/pypi/l/django-celery-beat.svg#foo
:alt: BSD License
:target: https://opensource.org/licenses/BSD-3-Clause
.. |wheel| image:: https://img.shields.io/pypi/wheel/django-celery-beat.svg#foo
:alt: django-celery-beat can be installed via wheel
:target: http://pypi.python.org/pypi/django-celery-beat/
.. |pyversion| image:: https://img.shields.io/pypi/pyversions/django-celery-beat.svg#foo
:alt: Supported Python versions.
:target: http://pypi.python.org/pypi/django-celery-beat/
.. |pyimp| image:: https://img.shields.io/pypi/implementation/django-celery-beat.svg#foo
:alt: Support Python implementations.
:target: http://pypi.python.org/pypi/django-celery-beat/
django-celery-beat as part of the Tidelift Subscription
-------------------------------------------------------
The maintainers of django-celery-beat and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. `Learn more`_.
.. _Learn more: https://tidelift.com/subscription/pkg/pypi-django-celery-beat?utm_source=pypi-django-celery-beat&utm_medium=referral&utm_campaign=readme&utm_term=repo
FAQs
Database-backed Periodic Tasks.
We found that django-celery-beat demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 4 open source maintainers collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Deno 2.6 introduces deno audit with a new --socket flag that plugs directly into Socket to bring supply chain security checks into the Deno CLI.

Security News
New DoS and source code exposure bugs in React Server Components and Next.js: what’s affected and how to update safely.

Security News
Socket CEO Feross Aboukhadijeh joins Software Engineering Daily to discuss modern software supply chain attacks and rising AI-driven security risks.