Cron scheduling extension for FastAPI with decorators, async support, Hooks, CLI, and SQLite job tracking.
Project description
FASTAPI-CRONS
Effortlessly schedule and manage your background tasks.
Built with the tools and technologies:
FastAPI Crons โ Developer Guide
Welcome to the official guide for using fastapi_crons, a high-performance, developer-friendly cron scheduling extension for FastAPI. This library enables you to define, monitor, and control scheduled background jobs using simple decorators and provides CLI tools, web-based monitoring, and SQLite-based job tracking.
๐ Features
- Native integration with FastAPI using
from fastapi import FastAPI, Crons - Define cron jobs with decorators
- Async + sync job support
- SQLite job state persistence
- CLI for listing and managing jobs
- Automatic monitoring endpoint (
/crons) - Named jobs, tags, and metadata
- Easy to plug into any FastAPI project
๐ฆ Installation
pip install fastapi-crons
๐ ๏ธ Quick Start
1. Setup FastAPI with Crons
from fastapi import FastAPI
from fastapi_crons import Crons, get_cron_router
app = FastAPI()
crons = Crons(app)
app.include_router(get_cron_router())
@app.get("/")
def root():
return {"message": "Hello from FastAPI"}
2. Define Cron Jobs
@crons.cron("*/5 * * * *", name="print_hello")
def print_hello():
print("Hello! I run every 5 minutes.")
@crons.cron("0 0 * * *", name="daily_task", tags=["rewards"])
async def run_daily_task():
# Distribute daily rewards or any async task
await some_async_function()
Cron Expression overview
โโโโโโโโโโโโโโ minute (0 - 59)
โ โโโโโโโโโโโโโโ hour (0 - 23)
โ โ โโโโโโโโโโโโโโ day of the month (1 - 31)
โ โ โ โโโโโโโโโโโโโโ month (1 - 12)
โ โ โ โ โโโโโโโโโโโโโโ day of the week (0 - 6) (Sunday to Saturday)
โ โ โ โ โ
* * * * *
Examples:
* * * * *: Every minute*/15 * * * *: Every 15 minutes0 * * * *: Every hour0 0 * * *: Every day at midnight0 0 * * 0: Every Sunday at midnight
๐ฅ๏ธ Cron Monitoring Endpoint
Once included, visit:
GET /crons
You'll get a full list of jobs with:
nameexpr(cron expression)tagslast_run(from SQLite)next_run
๐งฉ SQLite Job State Tracking
We use SQLite (via aiosqlite) to keep a persistent record of when each job last ran. This allows observability and resilience during restarts.
Table:
CREATE TABLE IF NOT EXISTS job_state (
name TEXT PRIMARY KEY,
last_run TEXT
);
Configuration
By default, job state is stored in a SQLite database named cron_state.db in the current directory. You can customize the database path:
from fastapi_crons import Crons, SQLiteStateBackend
# Custom database path
state_backend = SQLiteStateBackend(db_path="/path/to/my_crons.db")
crons = Crons(state_backend=state_backend)
๐งต Async + Thread Execution
The scheduler supports both async and sync job functions Jobs can be:
async defโ run in asyncio loopdefโ run safely in background thread usingawait asyncio.to_thread(...)
๐งช CLI Support
# List all registered jobs
fastapi-crons list
# Manually run a specific job
fastapi-crons run_job <job_name>
๐งฉ Advanced Features
- Distributed locking via Redis
- Retry policies
- Manual run triggers via HTTP
- Admin dashboard with metrics
Job Tags
You can add tags to jobs for better organization:
@cron_job("*/5 * * * *", tags=["maintenance", "cleanup"])
async def cleanup_job():
# This job has tags for categorization
pass
โ๏ธ Architecture Overview
FastAPI App
โ
โโโ Crons()
โ โโโ Registers decorated jobs
โ โโโ Starts background scheduler (async)
โ
โโโ SQLite Backend
โ โโโ Tracks last run for each job
โ
โโโ /crons endpoint
โ โโโ Shows current job status (with timestamps)
โ
โโโ CLI Tool
โโโ List jobs / Run manually
๐ง Contributing
We welcome PRs and suggestions! If you'd like this added to FastAPI officially, fork the repo, polish it, and submit to FastAPI with a clear integration proposal.
๐ก๏ธ Error Handling
- Each job has an isolated error handler
- Errors are printed and don't block scheduler
- Future: Add error logging / alert hooks
๐ License
Need help? Reach out:
Read Documentation at:
Documentation
๐ฌ Credits
Made with โค๏ธ by Mehar Umar.
Designed to give developers freedom, flexibility, and control when building production-grade FastAPI apps.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file fastapi_crons-2.1.1.tar.gz.
File metadata
- Download URL: fastapi_crons-2.1.1.tar.gz
- Upload date:
- Size: 53.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
788f2c995677a80d5756bafaa313d64c604d7410657e9e8fb331fd5e39447de2
|
|
| MD5 |
4046dc0940feba0750fcd1c8dddf106f
|
|
| BLAKE2b-256 |
719778a56431df9ef72e2f7a8714c591948c86cdf8f2759ecd02f8f3959fc9ac
|
File details
Details for the file fastapi_crons-2.1.1-py3-none-any.whl.
File metadata
- Download URL: fastapi_crons-2.1.1-py3-none-any.whl
- Upload date:
- Size: 64.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.19
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73d3c297dec1d035d2a4404021e277702f851785f6fea60f7035afcbaf667d3b
|
|
| MD5 |
d4cb41ef76a03c713f304bf7282cfeb7
|
|
| BLAKE2b-256 |
e984d6f9d7a78677da63d701e5dedccb89752e3f118f2f3e7e5db9b889553ce4
|