Skip to main content

A flexible and efficient rate limiting library for Django applications

Project description

Django Smart Ratelimit

CI PyPI version PyPI status Python versions Django versions Downloads License

A flexible and efficient rate limiting library for Django applications with support for multiple backends and automatic fallback.

✨ Features

  • 🚀 High Performance: Atomic operations using Redis Lua scripts and optimized algorithms
  • 🔧 Flexible Configuration: Both decorator and middleware support with custom key functions
  • 🪟 Multiple Algorithms: Fixed window and sliding window rate limiting
  • 🔌 Multiple Backends: Redis, Database, Memory, and Multi-Backend with automatic fallback
  • 📊 Rich Headers: Standard rate limiting headers (X-RateLimit-*)
  • 🛡️ Production Ready: Comprehensive testing, error handling, and monitoring
  • 🔄 Auto-Fallback: Seamless failover between backends when one goes down
  • 📈 Health Monitoring: Built-in health checks and status reporting

🚀 Quick Setup

1. Installation

pip install django-smart-ratelimit

2. Add to Django Settings

# settings.py
INSTALLED_APPS = [
    # ... your apps
    'django_smart_ratelimit',
]

# Basic Redis configuration (recommended for production)
RATELIMIT_BACKEND = 'redis'
RATELIMIT_REDIS = {
    'host': 'localhost',
    'port': 6379,
    'db': 0,
}

3. Choose Your Style

Option A: Decorator Style (View-Level)

from django_smart_ratelimit import rate_limit
from django.http import JsonResponse

@rate_limit(key='ip', rate='10/m')
def api_endpoint(request):
    return JsonResponse({'message': 'Hello World'})

@rate_limit(key='user', rate='100/h', block=True)
def user_api(request):
    return JsonResponse({'data': 'user-specific data'})

Option B: Middleware Style (Application-Level)

# settings.py
MIDDLEWARE = [
    'django_smart_ratelimit.middleware.RateLimitMiddleware',
    # ... other middleware
]

RATELIMIT_MIDDLEWARE = {
    'DEFAULT_RATE': '100/m',
    'RATE_LIMITS': {
        '/api/': '1000/h',
        '/auth/login/': '5/m',
    },
    'SKIP_PATHS': ['/admin/', '/health/'],
}

4. Test It Works

# Check backend health
python manage.py ratelimit_health

# Test with curl
curl -I http://localhost:8000/api/endpoint/
# Look for X-RateLimit-* headers

That's it! You now have rate limiting protection. 🎉

📖 Documentation

Core Concepts

Advanced Configuration

Development & Contributing

🏗️ Basic Examples

Decorator Examples

from django_smart_ratelimit import rate_limit

# Basic IP-based limiting
@rate_limit(key='ip', rate='10/m')
def public_api(request):
    return JsonResponse({'message': 'Hello World'})

# User-based limiting (requires authentication)
@rate_limit(key='user', rate='100/h')
def user_dashboard(request):
    return JsonResponse({'user_data': '...'})

# Custom key with fallback
@rate_limit(key='user_or_ip', rate='50/h')
def flexible_api(request):
    return JsonResponse({'data': '...'})

# Block when limit exceeded (default is to continue)
@rate_limit(key='ip', rate='5/m', block=True)
def strict_api(request):
    return JsonResponse({'sensitive': 'data'})

Middleware Configuration

# settings.py
RATELIMIT_MIDDLEWARE = {
    # Default rate for all paths
    'DEFAULT_RATE': '100/m',

    # Path-specific rates
    'RATE_LIMITS': {
        '/api/auth/': '10/m',      # Authentication endpoints
        '/api/upload/': '5/h',     # File uploads
        '/api/search/': '50/m',    # Search endpoints
        '/api/': '200/h',          # General API
    },

    # Paths to skip (no rate limiting)
    'SKIP_PATHS': [
        '/admin/',
        '/health/',
        '/static/',
    ],

    # Custom key function
    'KEY_FUNCTION': 'myapp.utils.get_api_key_or_ip',

    # Block requests when limit exceeded
    'BLOCK': True,
}

🔧 Backend Options

Redis (Recommended for Production)

RATELIMIT_BACKEND = 'redis'
RATELIMIT_REDIS = {
    'host': 'localhost',
    'port': 6379,
    'db': 0,
    'password': 'your-password',  # if needed
    'socket_timeout': 0.1,
}

Database (Good for Small Scale)

RATELIMIT_BACKEND = 'database'
# No additional configuration needed
# Uses your default Django database

Memory (Development Only)

RATELIMIT_BACKEND = 'memory'
RATELIMIT_MEMORY_MAX_KEYS = 10000

Multi-Backend (High Availability)

RATELIMIT_BACKENDS = [
    {
        'name': 'primary_redis',
        'backend': 'redis',
        'config': {'host': 'redis-primary.example.com'}
    },
    {
        'name': 'fallback_redis',
        'backend': 'redis',
        'config': {'host': 'redis-fallback.example.com'}
    },
    {
        'name': 'emergency_db',
        'backend': 'database',
        'config': {}
    }
]
RATELIMIT_MULTI_BACKEND_STRATEGY = 'first_healthy'

🔍 Monitoring

Health Checks

# Basic health check
python manage.py ratelimit_health

# Detailed status
python manage.py ratelimit_health --verbose

# JSON output for monitoring
python manage.py ratelimit_health --json

Cleanup (Database Backend)

# Clean expired entries
python manage.py cleanup_ratelimit

# Preview what would be deleted
python manage.py cleanup_ratelimit --dry-run

# Clean entries older than 24 hours
python manage.py cleanup_ratelimit --older-than 24

🆚 Comparison

Feature django-smart-ratelimit django-ratelimit django-rest-framework
Multiple Backends ✅ Redis, DB, Memory, Multi ❌ Cache only ❌ Cache only
Sliding Window
Auto-Fallback
Health Monitoring
Standard Headers ⚠️ Limited
Atomic Operations ⚠️ Race conditions ⚠️ Race conditions
Production Ready ⚠️ ⚠️

🤝 Contributing

We welcome contributions! See our Contributing Guide for details on:

  • Setting up the development environment
  • Running tests and code quality checks
  • Submitting pull requests
  • Code style guidelines

💖 Support the Project

If you find this project helpful and want to support its development, you can make a donation:

  • USDT (Ethereum): 0x202943b3a6CC168F92871d9e295537E6cbc53Ff4

Your support helps maintain and improve this open-source project for the Django community! 🙏

📜 License

This project is licensed under the MIT License - see the LICENSE file for details.

🙏 Acknowledgments

  • Inspired by various rate limiting implementations in the Django ecosystem
  • Built with performance and reliability in mind for production use
  • Community feedback and contributions help make this better

DocumentationExamplesContributingIssues

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_smart_ratelimit-0.3.2.tar.gz (51.0 kB view details)

Uploaded Source

Built Distribution

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

django_smart_ratelimit-0.3.2-py3-none-any.whl (31.5 kB view details)

Uploaded Python 3

File details

Details for the file django_smart_ratelimit-0.3.2.tar.gz.

File metadata

  • Download URL: django_smart_ratelimit-0.3.2.tar.gz
  • Upload date:
  • Size: 51.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for django_smart_ratelimit-0.3.2.tar.gz
Algorithm Hash digest
SHA256 e9b7fdd9f1cab5bfd912c6ba115b4c31d412f487b66b9801887e920762868420
MD5 5d8258fe050477b4083f257098a6d03d
BLAKE2b-256 0e6a40f1c33e84dd44a33eeff23a5833fae598dad5df2f1a6df959b65d622e52

See more details on using hashes here.

File details

Details for the file django_smart_ratelimit-0.3.2-py3-none-any.whl.

File metadata

File hashes

Hashes for django_smart_ratelimit-0.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 24e8ae412d0ee14096306335ace4a3621894ea42e1225233d6027a0afca7dcf0
MD5 575866a17e5b43de080f1b09fe264d30
BLAKE2b-256 c04ce12b67cda99d69dc3e066cb440e7700b52524426c525254e2149b18a1153

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