django-throttle-requests icon indicating copy to clipboard operation
django-throttle-requests copied to clipboard

a framework for implementing application-level request throttling for Django

======================== django-throttle-requests

a framework for implementing application-specific rate-limiting middleware for Django projects

|Build| |PyVersion| |PyPiVersion| |License|

What this module is intended for:

Implementing application-level (or just below) rate-limiting rules. Often, these rules would be expressed as "max # requests within a defined time period". E.g.:

  • an IP address may make at most 1500 requests/day

  • users with an OAuth access token may make 500 reads/hour and 200 writes/hour

What it is not intended for:

A token bucket or leaky bucket filter: intended primarily for traffic shaping, those algorithms are implemented by firewalls and servers such as nginx.

Installation

#. Install the library with pip::

sudo pip install django-throttle-requests

#. Add the directory throttle to your project's PYTHONPATH.

#. Insert the following configuration into your project's settings::

THROTTLE_ZONES = {
    'default': {
        'VARY':'throttle.zones.RemoteIP',
        'NUM_BUCKETS':2,  # Number of buckets worth of history to keep. Must be at least 2
        'BUCKET_INTERVAL':15 * 60,  # Period of time to enforce limits.
        'BUCKET_CAPACITY':50,  # Maximum number of requests allowed within BUCKET_INTERVAL
    },
}

# Where to store request counts.
THROTTLE_BACKEND = 'throttle.backends.cache.CacheBackend'

# Optional after Redis backend is chosen ('throttle.backends.redispy.RedisBackend')
THROTTLE_REDIS_HOST = 'localhost'
THROTTLE_REDIS_PORT = 6379
THROTTLE_REDIS_DB = 0  
THROTTLE_REDIS_AUTH = 'pass'

# Normally, throttling is disabled when DEBUG=True. Use this to force it to enabled.
THROTTLE_ENABLED = True

#. Use the @throttle decorator to enforce throttling rules on a view::

from throttle.decorators import throttle

@throttle(zone='default')
def myview(request):
   ...

#. Also works with class-based views::

from django.views.generic import View
from django.utils.decorators import method_decorator

from throttle.decorators import throttle

class TestView(View):

    @method_decorator(throttle(zone='default'))
    def dispatch(self, *args, **kwargs):
        return super(TestView, self).dispatch(*args, **kwargs)

    def head(self, request):
        ...

    def get(self, request):
        ...

:Code: https://github.com/sobotklp/django-throttle-requests :Documentation: https://readthedocs.org/projects/django-throttle-requests/

.. |PyPiVersion| image:: https://img.shields.io/pypi/v/django-throttle-requests.svg :alt: PyPi :target: https://pypi.python.org/pypi/django-throttle-requests

.. |License| image:: https://img.shields.io/badge/license-MIT-yellow.svg :alt:

.. |PyVersion| image:: https://img.shields.io/badge/python-2.7+-blue.svg :alt:

.. |Build| image:: https://github.com/sobotklp/django-throttle-requests/workflows/CI/badge.svg?branch=master :target: https://github.com/sobotklp/django-throttle-requests/actions?workflow=CI :alt: CI Status