django-apscheduler
APScheduler for Django
Decision gist · record as of 2026-08-14
Yes, if you have a small number of scheduled tasks and can run a single dedicated scheduler process. The low install friction and Django admin integration make it ideal for simple use cases. No, if you need to scale horizontally across multiple worker processes, run high-frequency jobs, or require distributed task coordination—use a message-broker-based alternative like Celery instead. The aging maintenance status (685 days since last release) is a minor concern but not a blocker given the stable nature of the underlying APScheduler library.AI-flagged interpretation of the facts on this page — verify before relying
Before you install
- You must run only one scheduler instance at a time; APScheduler lacks interprocess synchronization, so multiple schedulers will not coordinate job execution and may run jobs multiple times or miss executions entirely.
- Low install friction with only two runtime dependencies (django and apscheduler).
- Maintenance status is aging—last release was 685 days ago, though the repository remains active with recent commits and moderate community engagement (712 stars).
License · maintenance · safety
MIT (permissive) — MIT license is permissive, allowing commercial and private use with minimal restrictions; you may use and modify the package freely provided you include the license notice.
last release 2024-09-28 (685 days) · last repo commit 2025-03-23 · 712 stars
0 known vulnerabilities (OSV.dev, 2026-08-14) · 230,494 downloads/mo, #9,107 on PyPI
Alternatives
Verify before relying
pip install django-apscheduler
# In settings.py:
INSTALLED_APPS = (
"django_apscheduler",
)
# In a custom management command:
from apscheduler.schedulers.blocking import BlockingScheduler
from django_apscheduler.jobstores import DjangoJobStore
scheduler = BlockingScheduler()
scheduler.add_jobstore(DjangoJobStore(), "default")
scheduler.add_job(my_job, trigger=CronTrigger(second="*/10"), id="my_job")
scheduler.start()- Whether the 685-day gap since last release indicates active maintenance or dormancy relative to Django's release cycle.
- Performance characteristics when managing large numbers of scheduled jobs or high-frequency task execution.
- Compatibility with Django deployment patterns beyond single-process schedulers (e.g., containerized or load-balanced environments).
What it is and what it does
django-apscheduler wraps APScheduler to let you define and persist scheduled jobs directly in your Django database. Instead of managing cron jobs externally or using separate task queues, you add jobs through a custom Django management command, and the package stores them using Django's ORM. You can view, edit, and manually trigger jobs from the Django admin interface, and the package maintains an execution history showing when each job ran and whether it succeeded or failed.
The trade-off is simplicity for scale: it works well for a handful of fixed-schedule tasks in smaller deployments, but it requires careful architecture in production because APScheduler has no built-in way for multiple scheduler processes to coordinate. If you run many web workers, each one starting its own scheduler, jobs will execute multiple times or be skipped. The package documents three workarounds: run a single dedicated scheduler process (recommended), implement custom remote synchronization, or switch to a message-broker-based task queue like Celery or Django-RQ.
Use it for
- Run periodic cleanup tasks (e.g., deleting old logs or expired records) on a fixed schedule without external cron infrastructure.
- Trigger daily or weekly reports, email digests, or data exports from within Django, with execution history visible in the admin.
- Schedule one-off or recurring maintenance jobs (database optimization, cache refresh) and monitor their success from the admin interface.
- Manage simple recurring reminders or notifications without introducing a separate task queue system.
- Prototype scheduling features quickly in development before committing to a more complex distributed task system.
Worth the install?
AI-flagged interpretation of the facts on this page. Verify before relying on it.
Yes, if you have a small number of scheduled tasks and can run a single dedicated scheduler process.
The low install friction and Django admin integration make it ideal for simple use cases. No, if you need to scale horizontally across multiple worker processes, run high-frequency jobs, or require distributed task coordination—use a message-broker-based alternative like Celery instead. The aging maintenance status (685 days since last release) is a minor concern but not a blocker given the stable nature of the underlying APScheduler library.
Install
django-apscheduler on PyPI
Before you install
Low install friction with only two runtime dependencies (django and apscheduler). Maintenance status is aging—last release was 685 days ago, though the repository remains active with recent commits and moderate community engagement (712 stars).
You must run only one scheduler instance at a time; APScheduler lacks interprocess synchronization, so multiple schedulers will not coordinate job execution and may run jobs multiple times or miss executions entirely.
License in practice
MIT license is permissive, allowing commercial and private use with minimal restrictions; you may use and modify the package freely provided you include the license notice.
Quickstart
pip install django-apscheduler
# In settings.py:
INSTALLED_APPS = (
"django_apscheduler",
)
# In a custom management command:
from apscheduler.schedulers.blocking import BlockingScheduler
from django_apscheduler.jobstores import DjangoJobStore
scheduler = BlockingScheduler()
scheduler.add_jobstore(DjangoJobStore(), "default")
scheduler.add_job(my_job, trigger=CronTrigger(second="*/10"), id="my_job")
scheduler.start()
Verify before relying
- Whether the 685-day gap since last release indicates active maintenance or dormancy relative to Django's release cycle.
- Performance characteristics when managing large numbers of scheduled jobs or high-frequency task execution.
- Compatibility with Django deployment patterns beyond single-process schedulers (e.g., containerized or load-balanced environments).
Package facts
| License | MIT permissive |
| Python support | Not specified |
| Install friction | Low. Pure-Python wheel |
| Runtime dependencies | 2 packagesdjangoapscheduler |
| Maintenance | Aging 685 days since the last release |
| Last repo commit | |
| First released | |
| Downloads | 230,494 / month, #9,107 on PyPI 30-day window, as of 2026-08-14 |
| Known vulnerabilities | None known OSV.dev, checked 2026-08-14 |
| Classifiers | Development Status :: 4 - BetaEnvironment :: Web EnvironmentFramework :: DjangoFramework :: Django :: 4.2Framework :: Django :: 5.0Framework :: Django :: 5.1Intended Audience :: DevelopersLicense :: OSI Approved :: MIT LicenseOperating System :: OS IndependentProgramming Language :: PythonProgramming Language :: Python :: 3Programming Language :: Python :: 3 :: OnlyProgramming Language :: Python :: 3.10Programming Language :: Python :: 3.11Programming Language :: Python :: 3.12Programming Language :: Python :: 3.9 |
Evidence: django_apscheduler-0.7.0-py3-none-any.whl
Tags
Let your AI agent find packages like this
Example. Real query, live index.
You found this page by searching. An agent finds it by wishing: SkillFed indexes 14,416 PyPI packages by what they can do, searchable in plain language.
wish › “persistent task scheduler django”
- django-apschedulerAdds persistent job scheduling to Django applications using…
- sqlalchemy-celery-beatProvides a SQLAlchemy-backed scheduler for Celery that stores…
- django-q2Django Q2 is a multiprocessing distributed task queue for Django that…
Give your agent the search over MCP, or paste the wish link into any chat.
More Monitoring packages
Wraps any iterable to display a real-time progress bar in the terminal or Jupyter notebook, showing iteration count, elapsed time, and estimated time remaining.
Provides generated Python code for OpenTelemetry semantic conventions, enabling standardized attribute naming and constant definitions for instrumentation and telemetry collection.
Install it if you are using OpenTelemetry and want to follow semantic conventions correctly.
Provides the reference implementation of the OpenTelemetry API for collecting and exporting traces, metrics, and logs from Python applications.
Provides the abstract API and interfaces for OpenTelemetry instrumentation in Python, defining how to emit traces, metrics, and logs without tying code to a specific SDK implementation.
Exports OpenTelemetry observability data to an OpenTelemetry Collector using Protobuf-encoded messages over HTTP.
Install it if you are using OpenTelemetry in Python and need to send data to a Collector over HTTP.
Provides automatic instrumentation commands and programmatic APIs to inject distributed tracing into Python applications without code changes, detecting and instrumenting packages used by your program.
Install it if you need distributed tracing without code changes and have compatible instrumented packages in your environment.
See also APScheduler · Flask-APScheduler · django-crontab · aiojobs · dj-materialized-views · django-rq · rq-scheduler · scheduler · django-celery-beat · django-tasks-db