Catalog PyPI
PACKAGE EXPLORERView in registry

ads_throttle

PyPI

Django app to mitigate ad network ban risk by throttling suspicious ad impressions.

Versions collected1
Direct dependencies1From release 0.1.3
Last observed20 Oct, 19:54 UTC

README

Version 0.1.3 documentation

ads_throttle — Django ad impression throttling to reduce ad network ban risk

ads_throttle is a Django application that limits how often ads are shown to the same viewer within a configurable time window and allows manual overrides via the Django admin interface.

It is designed to reduce the risk of ad network bans caused by abnormal or suspicious ad impression patterns (for example, bot traffic or third-party abuse).

How it works

  1. A viewer fingerprint is computed using:

    • authenticated user ID or session key,
    • IP address,
    • User-Agent.
  2. For each page (or logical page group called a scope), an impression counter is stored in cache.

  3. If the number of impressions exceeds the configured threshold within the time window, ads are temporarily blocked for that viewer.

  4. Ads are automatically unblocked after the configured TTL.

  5. Administrators can force show or force block ads for specific users, IPs, viewer IDs, or page scopes via Django Admin.

Ads are throttled — users and traffic are not blocked.

Installation

pip install ads-throttle

Add the app to Django:

# settings.py
INSTALLED_APPS = [
    # ...
    "ads_throttle",
]

Optional: global context processor

Use this option when ads are rendered on most pages:

TEMPLATES = [
    {
        "OPTIONS": {
            "context_processors": [
                # ...
                "ads_throttle.context_processors.ads",
            ],
        },
    },
]

Run migrations:

python manage.py migrate

Usage

Templates (with context processor)

Best when ads appear on most pages:

{% if show_ads %}
  <!-- ad block -->
{% endif %}

Templates (without context processor)

Recommended when ads appear only on some pages:

{% load ads_throttle_tags %}
{% show_ads as show_ads %}
{% if show_ads %}
  <!-- ad block -->
{% endif %}

Or:

{% if request|should_show_ads %}
  <!-- ad block -->
{% endif %}

When using template tags or filters, the context processor is not required.

Python (custom placement logic)

from ads_throttle.throttling import should_show_ads

if should_show_ads(request, scope="/landing/"):
    ...

scope allows multiple URLs (for example, a landing page and its variants) to share the same throttling rules.

Requirements

  • Django database (PostgreSQL, MySQL, SQLite for development).

  • Cache backend supporting add and incr:

    • Redis (recommended),
    • Memcached,
    • Django database cache (development only).

Security and privacy

  • IP addresses are stored only as SHA256 hashes.
  • Viewer fingerprints are never stored in raw form.
  • No external tracking or third-party services are used.

What this package is NOT

  • It is not an ad fraud detection system.
  • It does not analyze clicks or conversions.
  • It does not attempt to bypass ad network policies.

It is a preventive throttling mechanism that limits ad impressions before abnormal patterns escalate into enforcement actions.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.1.34 Jan 20261

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Repository

ACCESSIBLE
frollow/throttle

Shared repository data · GitHub

License detected in repository
MIT
License branch / ref
master
Last push
4 Jan 2026
Archived
No
Contributor identities
— · partial collection

Public sponsor counts have not been collected. These signals belong to the repository owner.

Downloads & popularity

0count
Gauge · observed snapshots21 Oct 2026
10.50
2026-10-21: 0 · observed 2026-10-21T18:32:45.7215454Z
21 Oct21 Oct

github · 1 observations shown. Missing days are unknown.

View observed values
Date / source periodValueObserved at
2026-10-2102026-10-21T18:32:45.7215454Z

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 19:54 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:d23d6e8434598848728860d2ff7d43d2c43c047a7e938b40bc0806401b4da979