An open API service indexing awesome lists of open source software.

https://github.com/me-umar/fastapi-crons

fastapi-crons is a FastAPI extension for running cron jobs and background tasks in a clean, reliable way with async support and syntyx just like fastapi.
https://github.com/me-umar/fastapi-crons

asyncio background-tasks cron crons fastapi fastapi-crons schedular

Last synced: 5 months ago
JSON representation

fastapi-crons is a FastAPI extension for running cron jobs and background tasks in a clean, reliable way with async support and syntyx just like fastapi.

Awesome Lists containing this project

README

          

[![Python CI](https://github.com/me-umar/fastapi-crons/actions/workflows/ci.yml/badge.svg)](https://github.com/me-umar/fastapi-crons/actions/workflows/ci.yml)
[![PyPI - Version](https://img.shields.io/pypi/v/fastapi-crons)](https://pypi.org/project/fastapi-crons/)
[![GitHub Release](https://img.shields.io/github/v/release/me-umar/fastapi-crons)](https://github.com/me-umar/fastapi-crons/releases)

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

```bash
pip install fastapi-crons
```

---

## ๐Ÿ› ๏ธ Quick Start

### 1. Setup FastAPI with Crons

```python
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

```python
@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
```bash
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ 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 minutes
- `0 * * * *`: Every hour
- `0 0 * * *`: Every day at midnight
- `0 0 * * 0`: Every Sunday at midnight
---

## ๐Ÿ–ฅ๏ธ Cron Monitoring Endpoint

Once included, visit:

```
GET /crons
```

You'll get a full list of jobs with:

* `name`
* `expr` (cron expression)
* `tags`
* `last_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:

```sql
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:
```python
from fastapi_cron 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 loop
* `def` โ†’ run safely in background thread using `await asyncio.to_thread(...)`

---

## ๐Ÿงช CLI Support

```bash
# List all registered jobs
fastapi_cron list

# Manually run a specific job
fastapi_cron 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:
```python
@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

[Licence](LICENSE)

---

#### Need help? Reach out:
[Email me](mailto:contact@meharumar.codes)

[github](https://github.com/me-umar)

## Read Documentation at:
[Documentation](https://crons.meharumar.codes)
---
## ๐Ÿ’ฌ Credits

Made with โค๏ธ by Mehar Umar.
Designed to give developers freedom, flexibility, and control when building production-grade FastAPI apps.

---