Package: django-celery-beat
Version:2.5.0Web:http://django-celery-beat.readthedocs.io/Download:http://pypi.python.org/pypi/django-celery-beatSource:http://github.com/celery/django-celery-beatKeywords:django, celery, beat, periodic task, cron, schedulingAboutThis 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.Using the ExtensionUsage and installation instructions for this extension are available
from theCelery documentation.Important Warning about Time ZonesWarningIf you change the DjangoTIME_ZONEsetting 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:>>>fromdjango_celery_beat.modelsimportPeriodicTask,PeriodicTasks>>>PeriodicTask.objects.all().update(last_run_at=None)>>>fortaskinPeriodicTask.objects.all():>>>PeriodicTasks.changed(task)NoteThis will reset the state as if the periodic tasks have never run before.Modelsdjango_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 hourday-of-weekday_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 aPeriodicTaska counter in this table is also
incremented, which tells thecelery beatservice to reload the schedule
from the database.If you update periodic tasks in bulk, you will need to update the counter
manually:>>>fromdjango_celery_beat.modelsimportPeriodicTasks>>>PeriodicTasks.update_changed()Example creating interval-based periodic taskTo create a periodic task executing at an interval you must first
create the interval object:>>>fromdjango_celery_beat.modelsimportPeriodicTask,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.MICROSECONDSNoteIf 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:>>>IntervalSchedule.PERIOD_CHOICESNow that we have defined the schedule object, we can create the periodic task
entry:>>>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, thequeueto send it
to[*], and set an expiry time.Here’s an example specifying the arguments, note how JSON serialization is
required:>>>importjson>>>fromdatetimeimportdatetime,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 theexchangeandrouting_keyfields.Example creating crontab-based periodic taskA crontab schedule has the fields:minute,hour,day_of_week,day_of_monthandmonth_of_year, so if you want the equivalent
of a30 * * * *(execute every 30 minutes) crontab entry you specify:>>>fromdjango_celery_beat.modelsimportCrontabSchedule,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
ofinterval=schedule, specifycrontab=schedule:>>>PeriodicTask.objects.create(...crontab=schedule,...name='Importing contacts',...task='proj.tasks.import_contacts',...)Temporarily disable a periodic taskYou can use theenabledflag to temporarily disable a periodic task:>>>periodic_task.enabled=False>>>periodic_task.save()Example running periodic tasksThe periodic tasks still need ‘workers’ to execute them.
So make sure the defaultCelerypackage 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=infoAs a separate process, start the beat service (specify the Django scheduler):$ celery -A [project-name] beat -l info --scheduler django_celery_beat.schedulers:DatabaseSchedulerORyou can use the -S (scheduler flag), for more options seecelery beat--help):$ celery -A [project-name] beat -l info -S djangoAlso, as an alternative, you can run the two steps above (worker and beat services)
with only one command (recommended fordevelopment environment only):$ celery -A [project-name] worker --beat --scheduler django --loglevel=infoNow you can add and manage your periodic tasks from the Django Admin interface.InstallationYou can install django-celery-beat either via the Python Package Index (PyPI)
or from source.To install usingpip:$pipinstall-Udjango-celery-beatDownloading and installing from sourceDownload the latest version of django-celery-beat fromhttp://pypi.python.org/pypi/django-celery-beatYou can install it by doing the following :$tarxvfzdjango-celery-beat-0.0.0.tar.gz$cddjango-celery-beat-0.0.0$pythonsetup.pybuild# python setup.py installThe last command must be executed as a privileged user if
you are not currently using a virtualenv.After installation, adddjango_celery_beatto Django’s settings module:INSTALLED_APPS=[...,'django_celery_beat',]Run thedjango_celery_beatmigrations using:$pythonmanage.pymigratedjango_celery_beatUsing the development versionWith pipYou can install the latest snapshot of django-celery-beat using the following
pip command:$pipinstallhttps://github.com/celery/django-celery-beat/zipball/master#egg=django-celery-beatDeveloping django-celery-beatTo spin up a local development copy of django-celery-beat with Django admin athttp://127.0.0.1:58000/admin/run:$docker-composeup--buildLog-in as useradminwith passwordadmin.TZ Awareness:If you have a project that is time zone naive, you can setDJANGO_CELERY_BEAT_TZ_AWARE=Falsein your settings file.django-celery-beat as part of the Tidelift SubscriptionThe 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.