Skip to main content

Auto-populate django-celery-beat PeriodicTask objects with a simple @periodic_task decorator.

Project description

django-beat-periodic 🥁

PyPI version PyPI downloads Coverage

Auto-populate django-celery-beat PeriodicTask objects with a simple decorator — no manual admin setup required.

Installation 📥

pip install django-beat-periodic

Why Use This? 🤔

1. Periodic Tasks as Code — No Admin Required

Define schedules directly in your codebase. No need to manually create or update periodic tasks through the Django admin — everything is synced automatically on startup.

2. Dynamic, Environment-Aware Scheduling

Use environment variables or Django settings to change task intervals per environment — without touching the database:

import os
from django_beat_periodic import periodic_task

CLEANUP_INTERVAL = int(os.getenv("CLEANUP_INTERVAL", "3600"))  # 1h default

@periodic_task(interval=CLEANUP_INTERVAL)
def cleanup_old_records():
    ...

Run every 10 seconds in dev, every hour in production — same code, different env vars.

3. Version-Controlled Schedules

Since schedules live in code, every change is tracked in Git — you get full history, code review, and easy rollbacks. No more wondering who changed a task's interval in the admin.

4. Consistent Across Team & Deployments

New team members or fresh deployments get the correct periodic tasks automatically — no manual setup, no "did you remember to add the periodic task?" checklist.

5. Single Source of Truth

The decorator is the authoritative definition. If someone changes a task's settings in the admin, the next deployment will reset it to match the code — preventing configuration drift.

6. Automatic Cleanup of Stale Tasks

When you remove a @periodic_task decorator from your code, django-beat-periodic automatically deletes the corresponding PeriodicTask row from the database on the next startup. This keeps your database clean and ensures no ghost tasks are running.

[!NOTE] It only deletes tasks that were originally created by the package (marked with a specific description). Manually created tasks in the Django admin are never touched.

Quick Start 🚀

1. Add to INSTALLED_APPS

INSTALLED_APPS = [
    # ...
    "django_celery_beat",
    "django_beat_periodic",   # must come AFTER django_celery_beat
    # ...
]

2. Decorate Your Tasks

# myapp/tasks.py
from django_beat_periodic import periodic_task

@periodic_task(interval=60)
def heartbeat():
    """Runs every 60 seconds."""
    print("alive!")

@periodic_task(crontab="*/5 * * * *")
def generate_report():
    """Runs every 5 minutes (cron-style)."""
    build_report()

@periodic_task(interval=300, enabled=False)
def expensive_cleanup():
    """Registered but disabled by default."""
    cleanup_old_records()

3. Done! ✨

On Django startup, django_beat_periodic will automatically create or update the corresponding PeriodicTask, IntervalSchedule, and CrontabSchedule rows in your database. The Celery Beat scheduler picks them up immediately.

Decorator Options ⚙️

Parameter Type Description
interval int or timedelta Run every N seconds (or a timedelta)
crontab str or dict Cron expression ("* * * * *") or dict of fields
enabled bool (default True) Whether the task is enabled
name str Custom task name (defaults to module path)
queue str Celery queue to route to
priority int Task priority
args list Positional arguments for the task
kwargs dict Keyword arguments for the task

How It Works 🛠️

  1. @periodic_task registers metadata (schedule, enabled, etc.) in an internal registry and wraps the function with Celery's @app.task.
  2. When Django starts, DjangoBeatPeriodicConfig.ready() calls sync_periodic_tasks().
  3. sync_periodic_tasks() iterates the registry and creates or updates django_celery_beat database objects, only writing when something actually changed.

Management Commands

python manage.py sync_periodic_tasks
python manage.py sync_periodic_tasks --dry-run
python manage.py list_periodic_tasks
python manage.py list_periodic_tasks --all
python manage.py enable_periodic_task <task-name>
python manage.py disable_periodic_task <task-name>

list_periodic_tasks shows live database state. By default it lists only tasks managed by django-beat-periodic. Use --all to include every django-celery-beat periodic task; the output labels each task as managed or unmanaged.

enable_periodic_task and disable_periodic_task are temporary database toggles. On the next sync or Django process restart, managed tasks are restored to the enabled= value declared on the decorator. To permanently change a managed task state, update the decorator and redeploy.

Requirements 📋

  • Python ≥ 3.9
  • Django ≥ 3.2
  • Celery ≥ 5.0
  • django-celery-beat ≥ 2.0

Contributing 🤝

Contributions are welcome! To set up the project locally:

  1. Clone the repository:

    git clone https://github.com/mo-waseem/django-beat-periodic.git
    cd django-beat-periodic
    
  2. Install dependencies (using uv or pip):

    uv venv
    source .venv/bin/activate
    uv pip install -e ".[test]"
    
  3. Run tests to ensure everything is working:

    pytest
    

Feel free to open an issue or submit a pull request!

License 📄

MIT


PyPI: https://pypi.org/project/django-beat-periodic/

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

django_beat_periodic-0.6.0.tar.gz (86.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

django_beat_periodic-0.6.0-py3-none-any.whl (15.2 kB view details)

Uploaded Python 3

File details

Details for the file django_beat_periodic-0.6.0.tar.gz.

File metadata

  • Download URL: django_beat_periodic-0.6.0.tar.gz
  • Upload date:
  • Size: 86.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for django_beat_periodic-0.6.0.tar.gz
Algorithm Hash digest
SHA256 a4c1007f7ee0f9c10abd1466915ff7306094dd4f132abe7c7ca0fa5933118b03
MD5 f1dd36c8b6f8ede7195685ef63b7dd9b
BLAKE2b-256 07e9fc6bab7fc1731aa12312da2317e0abc6e3d5d15dc74eecc1760689b380d2

See more details on using hashes here.

File details

Details for the file django_beat_periodic-0.6.0-py3-none-any.whl.

File metadata

File hashes

Hashes for django_beat_periodic-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2d664323a7e55d412d383e729ce75fb5a1a23e771c420cddf9bd609b222f9099
MD5 81377c69edaa42ed56835e1d61fad18f
BLAKE2b-256 62c7cd8c7273e67d105b235805b09c42138b15d29c967e3088f9c93c2eba53a5

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page