Opened 6 weeks ago

Closed 6 weeks ago

#37288 closed New feature (needsnewfeatureprocess)

Add first-class rate limiting support for Django views

Reported by: Bader Eddine Benhirt Owned by:
Component: HTTP handling Version: 6.1
Severity: Normal Keywords: rate-limiting security http views middleware cache
Cc: Bader Eddine Benhirt Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Django currently doesn't provide a built-in general-purpose mechanism for rate limiting HTTP views.

Applications that need to protect endpoints against excessive requests currently rely on third-party packages, custom middleware, reverse proxies, or framework-specific solutions such as Django REST Framework throttling.

I propose adding a small, framework-level rate limiting abstraction to Django that can be used by regular function-based and class-based views.

A possible API could look like:

@rate_limit("api")
def index(request):
    ...


@rate_limit("api", methods={"POST", "PUT"})
def edit(request):
    ...


@rate_limit("exports", tokens=5)
def export(request):
    ...

Rate limit policies could be defined centrally in settings:

RATE_LIMITS = {
    "api": {
        "rate": "100/m",
        "key": "ip",
    },
    "exports": {
        "rate": "10/h",
        "key": "user",
    },
}

When a request exceeds its configured limit, Django could return an HTTP 429 Too Many Requests response and optionally include a Retry-After header.

The implementation should ideally support:

function-based views and class-based views.

  • authenticated-user and IP-based keys.
  • custom callable keys.
  • HTTP-method-specific limits.
  • multiple rate limits on the same view.
  • configurable request/token cost.
  • Django's cache abstraction as a storage backend.
  • synchronous and asynchronous views.
  • 429 Too Many Requests and Retry-After.
  • safe and clearly documented concurrency semantics.

There is already ticket #21289 concerning login rate limiting in contrib.auth, but this proposal would provide a more general primitive for Django HTTP views rather than being specific to authentication.

Similar declarative approaches now exist in other frameworks. For example, Symfony 8.1 introduced a controller-level #[RateLimit] attribute. This proposal would not aim to reproduce Symfony's API, but rather explore a Django-native equivalent.

An important design question is whether this belongs in Django core or should remain a third-party package. If considered suitable for core, I would be interested in working on the implementation.

Change History (1)

comment:1 by Sarah Boyce, 6 weeks ago

Resolution: → needsnewfeatureprocess
Status: new → closed

Hi

This report appears to be about requesting a new feature for Django.

Thank you for your suggestion! When suggesting a new feature for Django, the feature idea should first be proposed and discussed with the community. To do that, please raise this on the ​new feature tracker.

I'll close the ticket for now, but if the community agrees with the proposal, please return to this ticket and reference the discussion so we can re-open it. For more information, please refer to ​the documented guidelines for requesting features.

Thanks!

Note: See TracTickets for help on using tickets.
Back to Top