Skip to main content

Traffik Logo

Traffik

Rate limiting for Starlette and FastAPI applications

Test Python versions PyPI version License: MIT

Traffik is a rate limiting library for Starlette applications. With Traffik, you can write the throttle/limit once, point it at whatever you want to use as storage and it just works. Traffik also support dependency injection in FastAPI.

By default, throttles use the in-memory storage - which you can keep while you're developing. Switch to Redis or Memcached once you need to share state across processes, especially for production or live setups.

This started as a "I need to rate limit an API" project, and grew into a fairly complete (may be over-engineered) toolkit for it.

The core API (fixed window, sliding window, token bucket, a couple of backends) covers what you'll mostly need. However, there's more options to choose from if you want it.

pip install traffik

That is all that's needed for use with an in-memory backend. No extra dependencies needed. For Redis or Memcached, see Backends below.

Quickstart

Here, we have a simple rate limit setup. We're enforcing that every client, identified by IP (default identifier) can make a maximum of 100 requests per minute to our API's /items endpoint.

# main.py
from fastapi import FastAPI, Depends
from traffik import HTTPThrottle
from traffik.backends.inmemory import InMemoryBackend

backend = InMemoryBackend(namespace="myapp")
app = FastAPI(lifespan=backend.lifespan)

throttle = HTTPThrottle(uid="api:items", rate="100/min")

@app.get("/items", dependencies=[Depends(throttle)])
async def list_items():
    return {"items": []}

Notice that the throttle object required a unique id (uid). This helps with easy identification and clarity when reviewing limits later on, but it is mainly used by the library to namespace entries in the backend by that specific throttle and for some other advanced usages we'll see later on.

Run it with uvicorn main:app, and hit /items more than 100 times in a minute. You'll get a 429 just after you hit the 100 requests mark. Honestly, That is the whole contract. Everything below is configuration on top of this.

How Traffik works

A request encounters three main pieces on arriving at a throttled route or endpoint, each replaceable on its own and can be configured to taste or a specific need:

  • First, the Throttle. This is the thing you attach to a route. Holds the rate (or rate function), the cost (or cost function), the identifier, the error policy, and an optional preferred backend alongside other configurations. There are two throttle types HTTPThrottle - for regular HTTP routes/endpoints, and WebSocketThrottle for websocket connections and messages/frames.

  • Next we have the Strategy API. A strategy defines how we implement or enforce the limit specified on the throttle object. It is like a middleman that takes the limit definition from the throttle, fetches existing info about the current request been processed from the backend, does a check against its "algorithm" and returns a decision - whether to wait because the request has been limited or we can proceed to serve the request. It then stores the "decision" in the backend finally.

It mainly returns how long the client needs to wait before making its next request, that is if the request hit the limit set. The strategies included are FixedWindow, TokenBucket, LeakyBucket, GCRA, and other unique variants.

Simply put, it decides, "Given a key identifying a request, and a rate, should we let a request through?"

  • Lastly, the Backend. This is where the counters, records, basically all rate limit info about all the request seen by throttles in the application actually live. The main backends are InMemoryBackend, RedisBackend, and MemcachedBackend. The strategy reads from, and writes to it, as said earlier.

Traffik provides an experimental in-memory backend - MultiProcessInMemoryBackend. This is different from the InMemoryBackend in that it allows data stored to be shared across multiple processes on the same machine correctly. The regualr in-memory backend is single process only. This is useful when you have to synchonize rate limiting on a one-machine setup with your application running on multiple workers without spinning up a distributed backend like Redis.

One more thing you would notice is that backend's have a lifespan context manager which we pass to the FastAPI instance on initialization as done in the example above. But to be fair, its not strictly needed as you can manage the backend lifespan manually if your setup requires it. It sets up and initializes the backend on application startup, and tears it down properly (as configured) on application shutdown. Backends themselves can be used as context managers in a middleware, in the endpoint code or even API service layer. You can read more about it in the documention.

Backends

In-memory backend - single process only, no dependencies

from traffik.backends.inmemory import InMemoryBackend

backend = InMemoryBackend(namespace="myapp:inmemory")
app = FastAPI(lifespan=backend.lifespan)

With this backend, state lives in the process. It is fine for local development and single-worker deployments, and the wrong choice the moment you run more than one worker - each worker would count limits independently and your real limit pere request becomes configured_limit × worker_count.

Multi-process shared memory backend - multiple workers, one machine

EXPERIMENTAL! This is a non-conventional one and still requires a lot of testing to prove its stability. It may be removed in future releases. This only works on UNIX platforms with "fork" process start method.

If you're running gunicorn/uvicorn with several workers on a single box and don't want to stand up Redis just to get accurate counts across them then you can try out this backend.

I must say, setup may be trickier than other backends as it relies on process forking. Also context usage is constrained. You cannot use a closing context (close_on_exit=True) within the application with this one. Although, it is permitted at lifespan (outermost) level

from traffik.backends.multiprocess import MultiProcessInMemoryBackend

# Create before forking in your app factory or gunicorn's `on_starting`.
backend = MultiProcessInMemoryBackend(
    namespace="myapp",
    max_keys=65536,
    number_of_shards=64,     # rule of thumb: 2 × worker count
    cleanup_frequency=30.0,  # reclaim expired slots periodically
)
backend.start() # Call once in parent process

app = FastAPI(lifespan=backend.lifespan)

Workers attach to the same POSIX shared-memory segment after fork. Again it requires Linux, or macOS with multiprocessing.set_start_method("fork") set explicitly (fork is already the default on Linux).

Redis - with redis.asyncio client

This redis backend needs redis.asyncio as a dependency so you need to install it

uv add "traffik[aioredis]"
from traffik.backends.redis.aioredis import RedisBackend

backend = RedisBackend("redis://localhost:6379/0", namespace="myapp")

Redis - with coredis client

This redis backend needs coredis as a dependency so you need to install it

uv add "traffik[coredis]"
from traffik.backends.redis.coredis import RedisBackend

# Single node
backend = RedisBackend("redis://localhost:6379/0", namespace="myapp")

# Cluster
from coredis.connection import TCPLocation
backend = RedisBackend(
    [TCPLocation("127.0.0.1", 7000), TCPLocation("127.0.0.1", 7001)],
    namespace="myapp",
)

# Sentinel
from coredis import Sentinel
sentinel = Sentinel([("sentinel-host", 26379)])
backend = RedisBackend(sentinel, sentinel_service_name="myredis", namespace="myapp")

Default to aioredis (redis.asyncio) unless you specifically need cluster or Sentinel support. It's the more mature client and measurably faster in our benchmarks (see benchmarks/). Reach for coredis only when you need what it offers that aioredis doesn't or you already use it as a client in your application and you dont want to install another client just for rate limiting.

Memcached - with aiomcache client

This memcached backend needs aiomcache as a dependency so you need to install it

uv add "traffik[aiomcache]"
from traffik.backends.memcached.aiomcache import MemcachedBackend

backend = MemcachedBackend(host="localhost", port=11211, namespace="myapp")

Memcached - with emcache client (Linux/macOS, multi-node)

This memcached backend needs emcache as a dependency so you need to install it

uv add "traffik[emcache]"
from traffik.backends.memcached.emcache import MemcachedBackend

backend = MemcachedBackend(
    nodes=["memcached://node1:11211", "memcached://node2:11211"],
    namespace="myapp",
)

This one has Rendezvous hashing across nodes, adaptive connection pool, and has better overall throughput than aiomcache, although it is Linux/macOS only.

In summary, the required dependencies are;

pip install "traffik[aioredis]"    # redis.asyncio
pip install "traffik[coredis]"     # coredis - clusters, Sentinel
pip install "traffik[aiomcache]"   # memcached via aiomcache
pip install "traffik[emcache]"     # memcached via emcache, Linux/macOS only
pip install "traffik[all]"         # everything

traffik[redis] and traffik[memcached] still work as aliases for aioredis and aiomcache respectively, kept for backward compatibility with 1.1.x.

Strategies

Shown below are the main strategies Traffik provides for rate limting

from traffik.strategies import (
    FixedWindow,           # simple, cheap, allows boundary bursts up to 2x
    SlidingWindowCounter,  # weighted two-window approximation, good default
    SlidingWindowLog,      # exact, more memory
    TokenBucket,           # allows controlled bursts
    TokenBucketWithDebt,   # token bucket with configurable overdraft
    LeakyBucket,           # smooths output, no bursts
    LeakyBucketWithQueue,  # strict FIFO ordering
    GCRA,                  # perfectly smooth, zero burst tolerance by default
)

# Example usage
throttle = HTTPThrottle("api", rate="100/min", strategy=SlidingWindowCounter())

When initializing a throttle, you can skip the throttle's strategy argument and it uses FixedWindow by default. It is the cheapest one, and works correctl for most APIs. It is also the only strategy that never needs a lock, so it is fast on every backend, including the ones where locking gets expensive (see Performance).

Use SlidingWindowCounter if you encounter boundary bursts in practice, TokenBucket if you want to allow short bursts on top of a sustained rate, GCRA if you need genuinely even request spacing (think telecom-style SLAs, not "please don't hammer my API").

Advanced strategies

Other bespoke strategies available are in traffik.strategies.custom.

traffik.strategies.custom has six more: TieredRateStrategy, AdaptiveThrottleStrategy, PriorityQueueStrategy, QuotaWithRolloverStrategy, TimeOfDayStrategy, CostBasedTokenBucketStrategy.

Honestly, these exist because the problems were interesting to solve, not because most APIs need them. Per-tier limits, load-adaptive throttling, are real problems, bit just not your problem most of the time. Each has its own docs and example in the full documentation if one of these genuinely matches something you're dealing with.

Rate formats

Traffik permits you to specify your rate limits in various string format, the most common of which you can see below.

"100/min"      # 100 per minute
"5/s"          # 5 per second
"10/30s"       # 10 per 30 seconds
"1000/hour"
"500/day"
"200/500ms"    # sub-second windows

Rate(limit=50, minutes=1)   # explicit Rate object

Integration patterns

Rate limit application and definition may differ by context and based on the way your code or endpoints are setup. You can use throttles as dependencies, middleware or even hit/test them directly, anywhere in the route or endpoint.

FastAPI dependency

You can use throttles as dependencies on your routes:

router = APIRouter(dependencies=[Depends(throttle)])

Or directly on your endpoint definitions:

@app.get("/search", dependencies=[Depends(throttle)])
async def search():
    ...

Starlette and FastAPI decorator

Throttles can also be used to decorate endpoints, if you prefer that;

from traffik.throttle import HTTPThrottle

burst = HTTPThrottle("api:burst", rate="20/s")
sustained = HTTPThrottle("api:sustained", rate="500/min")

For Starlette;

from traffik.throttles import throttled

@throttled(burst, sustained)
async def upload(request: Request):
    ...

route = Route("/upload", upload, methods=["POST"])

For FastAPI:

from traffik.decorators import throttled

@app.post("/upload")
@throttled(burst, sustained)
async def upload(request: Request):
    ...

Note that the decorators are imported from different path. The FastAPI specific decorator uses dependency injection under the hood, while the ones used for Starlette is a regular wrapper decorator and can be use for both Starlette and FastAPI.

Middleware (blanket rules across routes)

Traffik provides the ThrottleMiddleware and MiddlewareThrottle classes for rate limiting in middleware.

Your regular HTTPThrottle and WebSocketThrottle still work with the middleware directly and you dont always need to wrap them in MiddlewareThrottle.

from traffik.middleware import ThrottleMiddleware, MiddlewareThrottle

app.add_middleware(
    ThrottleMiddleware,
    middleware_throttles=[
        MiddlewareThrottle(
            HTTPThrottle("api:global", rate="1000/min"),
            path="/api/",
        ),
        MiddlewareThrottle(
            HTTPThrottle("api:writes", rate="100/min"),
            path="/api/",
            methods={"POST", "PUT", "PATCH", "DELETE"},
        ),
    ],
    backend=backend,
)

path and methods go on MiddlewareThrottle, not on ThrottleMiddleware itself. ThrottleMiddleware just runs whichever MiddlewareThrottles match a given request.

WebSockets

Yes, Traffik supports rate limiting websockets both at connection level and at per message level

from traffik.throttles import WebSocketThrottle, is_throttled

ws_throttle = WebSocketThrottle("ws:messages", rate="30/min")

@app.websocket("/ws", dependencies=[Depends(ws_throttle)]) # Connection level
async def ws_endpoint(websocket: WebSocket):
    await websocket.accept()
    while True:
        data = await websocket.receive_text()
        await ws_throttle.hit(websocket, context={"scope": "message"}) # Per message level
        if is_throttled(websocket):
            # The default throttled handler already sent a *throttled* frame to the client
            # You can override that behaviour if you need something custom.
            continue
        await websocket.send_text(process(data))

Custom identifiers

The default identifier used by throttles is the client IP. However, you can key/identify on whatever you want - user ID, API key, tenant ID, etc.

Example: Identifying by API key

async def api_key(request: Request) -> str:
    return request.headers.get("X-API-Key") or request.client.host

throttle = HTTPThrottle("api", rate="100/min", identifier=api_key)

Return the EXEMPTED sentinel to let specific connections through unconditionally:

from traffik.types import EXEMPTED

async def identifier(request: Request):
    if request.headers.get("X-Internal-Token") == SECRET:
        return EXEMPTED
    return request.client.host

Cost-based throttling

Not all requests should count the same. Yes. You can specify cost per request or provide a function to compute it at runtime based on request info.

async def request_cost(request: Request, context=None) -> int:
    if "/export" in request.scope["path"]:
        return 10
    return 1

throttle = HTTPThrottle("api", rate="100/min", cost=request_cost)

# or override per-call
await throttle.hit(request, cost=5)

Response headers

If clients need to be informed on how they are being rate limited so they can adjust their traffic accordingly, headers allows your API to include that information (conventionally). Although you will need to do this manually in your routes or throttled handler(s) if you need (custom) headers.

from traffik.headers import Headers, Header

throttle = HTTPThrottle(
    "api",
    rate="100/min",
    headers=Headers({
        "X-RateLimit-Limit": Header.LIMIT(when="always"),
        "X-RateLimit-Remaining": Header.REMAINING(when="always"),
        "Retry-After": Header.RESET_SECONDS(when="throttled"),
    }),
)

To resolve headers manually, e.g. inside a custom throttled handler:

from traffik.exceptions import ConnectionThrottled

async def my_handler(request, wait_ms, throttle, context):
    headers = await throttle.get_headers(request, context=context)
    raise ConnectionThrottled(wait_period=int(wait_ms / 1000), headers=headers)

Rules

Traffik allows you to gate when a throttle applies, or skip it for certain traffic using rules. See examples on how to use them below.

from traffik.registry import throttle_if, bypass_if

# Only apply the global throttle to write methods
write_throttle.add_rules(
    "api:global",
    throttle_if(methods={"POST", "PUT", "PATCH", "DELETE"}),
)

# Skip throttling for internal traffic
async def is_internal(request: Request) -> bool:
    # Your implementation here
    ...

throttle = HTTPThrottle(
    "api:global",
    rate="100/min",
    rules=[bypass_if(predicate=is_internal)],
)

Deferred quota (QuotaContext)

There are some cases where you only want a request to consume limit/quota if an operation actually succeeds, or may be you want to consume several throttles as one unit operation, a QuotaContext allows you to do this. See documentation for full API description or refer to module, class and method docstrings.

from traffik.quotas import QuotaContext

async def create_order(request: Request):
    async with order_throttle.quota(request, lock=True) as quota:
        quota(cost=1)                       # this throttle
        quota(heavy_ops_throttle, cost=5)   # a different throttle, same transaction

        result = await do_expensive_work()
    # quota only consumed here, on clean exit
    return result

Consecutive calls to the same throttle with the same config aggregate into one backend operation. quota(cost=2); quota(cost=3) becomes a single increment(key, 5).

You can also check available quota without or before consuming it:

async with throttle.quota(request) as quota:
    if not await quota.check(cost=10):  # Works similarly to `throttle.check(...)`
        raise HTTPException(429, "Insufficient quota")
    quota(cost=10)
    result = await heavy_work()

Error handling and resilience

Errors occur always at runtime when processing requests. The throttling path is also prone to errors sometimes. Redis backend may hiccup due to temporary Redis unavailability. That raises the question, "What happens when the backend itself fails?". You can provide an error handler to handle these type of errors. The default handlers allow the throttle to fail open or close intelligently or switch to a fallback/backup backend temporarily until the main backend recovers. You could even switch backends permanently. Custom error handlers are also supported if you need one.

Example:

throttle = HTTPThrottle("api", rate="100/min", on_error="allow")     # fail open
throttle = HTTPThrottle("api", rate="100/min", on_error="throttle")  # fail closed (default)
throttle = HTTPThrottle("api", rate="100/min", on_error="raise")     # handle it yourself

Fall back to a secondary backend with an automatic circuit breaker:

from traffik.error_handlers import failover, CircuitBreaker
from traffik.backends.inmemory import InMemoryBackend
from traffik.backends.redis.aioredis import RedisBackend

primary = RedisBackend("redis://primary:6379", namespace="myapp")
fallback = InMemoryBackend(namespace="fallback")

throttle = HTTPThrottle(
    "api",
    rate="100/min",
    backend=primary,
    on_error=failover(
        backend=fallback,
        breaker=CircuitBreaker(failure_threshold=5, recovery_timeout=30.0),
    ),
)

After 5 consecutive Redis failures, the circuit opens and new requests fall back to in-memory immediately, no waiting on a timeout. It half-opens after 30 seconds, lets one probe request through, and closes again on success.

For transient errors you can use th retry handler:

from traffik.error_handlers import retry

throttle = HTTPThrottle(
    "api",
    rate="100/min",
    on_error=retry(max_retries=3, retry_delay=0.05, retry_on=(TimeoutError,)),
)

Dynamic backends (multi-tenant)

With Traffik, you can route different requests, clients, or even tenants to different backends at runtime, without having to define a unique throttles per case. Here's a simple example below. You can refer to the main documentation, implementaion docstrings or even look at the library's tests for more info on usage.

throttle = HTTPThrottle("api", rate="100/min", dynamic_backend=True)

@app.get("/data")
async def data(request: Request):
    tenant_backend = get_backend_for_tenant(request)
    async with tenant_backend(request.app):
        return await throttle.hit(request) # Uses tenant specific backend in this block
    # Goes back to global backend on context exit

This adds roughly 1–20ms of backend-resolution overhead per request though - just something to note. Use an explicit backend= instead, or leave it unset, if you don't actually need per-case backend routing and context switching.

Runtime updates

Throttles have methods that allow you to change their configuration safely at runtime without recreating them. Some (if not all) of these methods include.

await throttle.update_rate("200/min")
await throttle.update_strategy(TokenBucket())
await throttle.update_cost(5)
await throttle.disable()    # let everything through temporarily
await throttle.enable()

You can also disable globally, via the registry:

from traffik.registry import GLOBAL_REGISTRY

await GLOBAL_REGISTRY.disable_all()   # Say in maintenance mode
await GLOBAL_REGISTRY.enable_all()

Testing throttles - checking state without consuming it

You can check if the next request will exceeded the limit with check or test (alias) method.

stat = await throttle.stat(request)
if stat:
    print(f"{stat.hits_remaining} hits left, {stat.wait_ms}ms until next request allowed")
    print(stat.metadata)  # strategy-specific details

# or just a boolean
if not await throttle.check(request, cost=5):
    raise HTTPException(429, "Not enough quota for this operation")

Performance

Two things determine your actual overhead, and they are not necessarily coupled. They are; the backend you pick, and the strategy you pick.

The Backend chosen decides your baseline cost. In-memory has no network or IPC involved. You get sub- millisecond backend ops. Redis and Memcached are dominated by the round trip to wherever those services live, not by anything Traffik itself is doing. Multi-process shared memory skips the network entirely, but that's not a free lunch either.

Your Strategy decides whether you pay a locking tax on top of that baseline. FixedWindow (GCRA too) does one atomic increment and never takes a lock and is therefore cheap on every backend, including the ones where locking is expensive. TokenBucket and anything else that needs to read state, do math, and write it back has to hold a lock across all three steps, or two concurrent requests can both read "3 tokens left" and both spend one and then record "two tokens left", which quietly breaks your rate limit. It is not a bug, it is the correctness costs we have to pay for those types of algorithms. However, that means the backend you would otherwise pick on gut feel can behave differently once a distributed lock is involved.

Multi process backend cavaet - Why it may not be better than just using Redis or Memcached.

The multi-process backend can get more expensive than you would normally expect. Every read and write has to hop through a thread pool (run_in_executor) because the underlying primitives are blocking, not async. FixedWindow pays that tax once per request. TokenBucket pays it twice - once for the read, once for the write, while holding a per-shard lock the whole time. Stack fifty concurrent requests on one hot key and that adds up fast. Hence, you need to avoid hot keys with this backend.

Redis (local), despite paying real network round trips for the same get-lock-read-write-unlock sequence, ends up faster here, because a socket write to localhost is cheaper than a thread-pool handoff plus an OS semaphore under contention. Hosted Redis may perform simlar to or slightly better than the multi-process backend for this scenario. Not the result I'd have guessed either, and I believe it's a good reminder that "avoids the network" doesn't automatically mean "faster."

None of this is something you should take on my word without checking. You can run benchmarks yourself, against your own traffic shape (key cardinality, concurrency, strategy).

Running the benchmarks

Traffik includes a simple bechmark suite for performance and correctness testing. It tests throughput, latency and correctness per case run. Benchmarks are not the "one-all-be-all" but they can be a good starting point to get insight on how throttling may perform with specific traffic patterns. Moreover, I can't guarantee that the benchmarks I write are perfect or unbiased so take the results with a pinch of salt.

make install-bench   # pulls in the benchmark-only deps
make bench http                                  # everything, defaults (in-memory, fixed window)
make bench "http --backend aioredis --strategy token_bucket"
make bench "middleware --backend multiprocess"
make bench "http --scenarios hot_key,many_keys -n 5"   # just these two, 5 iterations

make bench forwards whatever you type after it straight to the CLI, so anything below works the same way with make bench in front instead of uv run -m benchmarks.

Or skip make and call the CLI directly:

uv run -m benchmarks http --backend inmemory
uv run -m benchmarks http --backend aioredis --strategy token_bucket
uv run -m benchmarks middleware --backend multiprocess
uv run -m benchmarks websocket --backend inmemory

--backend is inmemory / multiprocess / aioredis / coredis / aiomcache / emcache. --strategy is any of the eight core strategies from Strategies above, lowercased and snake_cased (fixed_window, token_bucket, gcra, ...). Redis/Memcached backends need the corresponding service running locally. docker compose up -d redis memcached handles that if you don't already have them.

Results print as a table by default; pass --output json if you want to feed them into something else. --concurrency controls how wide the concurrent-scenario batches are (default 50), -n/--iterations controls how many timed runs you get per scenario (default 3, plus one discarded warmup run).

Full documentation

https://ti-oluwa.github.io/traffik/ - Advanced strategies, WebSocket per-message throttling, testing patterns, full API reference. Everything that didn't fit here.

Contributing

Issues and PRs welcome. make dev-setup gets you a working dev environment, make test-fast for a quick sanity check before you push, make quality before you open a PR. See CONTRIBUTING.md for the actual details.

License

MIT

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

traffik-1.2.1.tar.gz (192.2 kB view details)

Uploaded Source

Built Distributions

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

traffik-1.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (210.9 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

traffik-1.2.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (209.5 kB view details)

Uploaded CPython 3.14manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

traffik-1.2.1-cp314-cp314-macosx_11_0_arm64.whl (203.3 kB view details)

Uploaded CPython 3.14macOS 11.0+ ARM64

traffik-1.2.1-cp314-cp314-macosx_10_15_x86_64.whl (202.9 kB view details)

Uploaded CPython 3.14macOS 10.15+ x86-64

traffik-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (210.9 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

traffik-1.2.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (209.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

traffik-1.2.1-cp313-cp313-macosx_11_0_arm64.whl (203.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

traffik-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl (202.9 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

traffik-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (210.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

traffik-1.2.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (209.3 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

traffik-1.2.1-cp312-cp312-macosx_11_0_arm64.whl (203.3 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

traffik-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl (202.9 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

traffik-1.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (210.9 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

traffik-1.2.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (209.4 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

traffik-1.2.1-cp311-cp311-macosx_11_0_arm64.whl (203.3 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

traffik-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl (202.9 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

traffik-1.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (210.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

traffik-1.2.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (209.4 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

traffik-1.2.1-cp310-cp310-macosx_11_0_arm64.whl (203.3 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

traffik-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl (202.9 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

traffik-1.2.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl (210.7 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ ARM64manylinux: glibc 2.28+ ARM64

traffik-1.2.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl (209.2 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.28+ x86-64manylinux: glibc 2.5+ x86-64

traffik-1.2.1-cp39-cp39-macosx_11_0_arm64.whl (203.3 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

traffik-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl (202.9 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

Details for the file traffik-1.2.1.tar.gz.

File metadata

  • Download URL: traffik-1.2.1.tar.gz
  • Upload date:
  • Size: 192.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1.tar.gz
Algorithm Hash digest
SHA256 84daf9750ed92c8cb4291d201f4e6a806245dc9027a9536e2e8d1c982910772e
MD5 4a3982d596a7ba9e0cd4a1f7761f5029
BLAKE2b-256 aa00c1b4597cdfa0eaa2841150106a113f569fe43de730ab92ed9b8200adb772

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
  • Upload date:
  • Size: 210.9 kB
  • Tags: CPython 3.14, manylinux: glibc 2.17+ ARM64, manylinux: glibc 2.28+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 902f9fdd128c0473b288235fffa9740f250ceafd92acc3d00a372fa2f15ba7f0
MD5 ec3a24a67f8b4239b3ca5f27b4b7c1b6
BLAKE2b-256 9b45315c501862eadc66a11800cd5067547e4c10708f01df4d906f97e4bc3fbc

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
  • Upload date:
  • Size: 209.5 kB
  • Tags: CPython 3.14, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 6bbbc7be06bf5d086bec2e17ffab04eccac1c2b70cae536b421be94bd791affd
MD5 eb46cc6d419e0ca07fd0a10f606e4402
BLAKE2b-256 8fc5a26ff3bbb95ebecd2687c1339c82b9f7618e4b5be7a21b811742ee3c95ab

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp314-cp314-macosx_11_0_arm64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp314-cp314-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 203.3 kB
  • Tags: CPython 3.14, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp314-cp314-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9f6bc9e378c93edcb997f04807031ab5c8e0ceab67f94a061196abfc4d9af384
MD5 738549fdd3ff1a2f102650e36a49f30d
BLAKE2b-256 7704f89a8df326673a69562af9465ad880516561ea9e666b1761e835aac76d5f

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp314-cp314-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp314-cp314-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 202.9 kB
  • Tags: CPython 3.14, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp314-cp314-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 573f046baa6b5f5592b25ac65e969669eec11d0b12d2a415414bf89d17a468c2
MD5 91e0711d407e7c6f854c1d7704ca151d
BLAKE2b-256 f2e823835f75a77cabf8679603f4b9482268f3150914c2c41e403f0082d0f3e0

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
  • Upload date:
  • Size: 210.9 kB
  • Tags: CPython 3.13, manylinux: glibc 2.17+ ARM64, manylinux: glibc 2.28+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5723c8c2a735e7afb3a16e1cd09b9efe2508aad644cac0e8e957007bcbeef666
MD5 f303f71f419914e2334fd7a58108fce6
BLAKE2b-256 5b74b297804834b52376f99a78921e2e3a70ec6673a4181d8d5496a23e8ab1bb

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
  • Upload date:
  • Size: 209.4 kB
  • Tags: CPython 3.13, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 5516702b2c167c7ed1c337b64c204ee198556560e940921010f59ac2365ed9fb
MD5 c279dd97ed9918bb4fbd93e6ea232c58
BLAKE2b-256 9fda04e2ae623f4093bd41e107970d405f0097c217e0c9dd7f1dd5ce40e2cc85

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp313-cp313-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 203.3 kB
  • Tags: CPython 3.13, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 98c9965907990b180568bf0ff07afd5d36d69849d2cb6d78c9c041da884c255b
MD5 472173db4269f256d4f117e1be7c68b7
BLAKE2b-256 6059a0de41fafc49b6320ee0977ca680a8301af4b94c415927dcd8f097bd8ff5

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl
  • Upload date:
  • Size: 202.9 kB
  • Tags: CPython 3.13, macOS 10.13+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a7e0375e8212c92bd0d316a7e454fca35c1482ed40968a6003f7c3d93a9cc539
MD5 16909862321697dbb5035ae76c97ff95
BLAKE2b-256 4aa29f53e93915dc652cba0b9153c6704e8cde3ccf5b747147874a2e97a9682c

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
  • Upload date:
  • Size: 210.8 kB
  • Tags: CPython 3.12, manylinux: glibc 2.17+ ARM64, manylinux: glibc 2.28+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 e23408f899e2a6a32384a4413e8829bc2d350b60ac265a274b72c75adf551c72
MD5 6af6b70603979fd2b3781365cfab818e
BLAKE2b-256 4dbda13978220e71237a9d87a0eaaa199efb02742e135ee15dc2b019040a63d2

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
  • Upload date:
  • Size: 209.3 kB
  • Tags: CPython 3.12, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 a19810bbfb4d53c5e01ea0cc6393d208f65c8cd2e321a3ceea185e76800f097e
MD5 b02eda61111344840edf9eadb4d40002
BLAKE2b-256 996e74d6819939217555b2d8cc416fea572808c55d256506b981316f085e2ee8

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp312-cp312-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 203.3 kB
  • Tags: CPython 3.12, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 603756e9a3465aae54666e0bf54f98d8176f90132d95d84739a8594ad4add815
MD5 c163db02d1ae99f07f64f9c4b8ebe311
BLAKE2b-256 2bad039222d8f349174fd6515b34876daf14f8ffe289dd6e373affd34942e48c

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl
  • Upload date:
  • Size: 202.9 kB
  • Tags: CPython 3.12, macOS 10.13+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 2487b88da221af9d46814d24e8507e39996a229613998f5ab61521b03ee21665
MD5 93ca5d54db6fc42c8ab6966d6ebcfb00
BLAKE2b-256 7597a7700c2c3a250aeceb3560f28ebf0f96c5808dd562aa33ddd9cadb64ba6c

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
  • Upload date:
  • Size: 210.9 kB
  • Tags: CPython 3.11, manylinux: glibc 2.17+ ARM64, manylinux: glibc 2.28+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 3deade1535e10977299bb786686ff7b5a8f5120489f32bc7109d9e4b8d6f5734
MD5 4021979632ba157b8d9503640a279c9e
BLAKE2b-256 2d26af79b98565d8c1930b73a673b96cadfc6814953ddd41cce84452f4076ce0

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
  • Upload date:
  • Size: 209.4 kB
  • Tags: CPython 3.11, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 de035b7fed8d743281fb17d1e518b8438df6d4f74feeb5a21fbb8bca1ae98cf3
MD5 21cde723f3013df00ab0695bea7db466
BLAKE2b-256 1287a93ffd6f48dfd118552c0984b18494eda75dfd649483f3473b421a458257

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp311-cp311-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 203.3 kB
  • Tags: CPython 3.11, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c3de6d84567fdd411311cda2de6c3b32f662ed13e516bc21950ddc87ea99e344
MD5 2c8e317d92e8b3d1776f9c927c47a7be
BLAKE2b-256 ac6422011fa5ef77c159daddd75a706543379cda03f0aae2d34440ada35ab2b1

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 202.9 kB
  • Tags: CPython 3.11, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 e34e113f1b5d921573f6fb8282b5cc350891536ed1ac44bb7f3de3a650ae031c
MD5 d7472192aa44b89d2250f3e9f06c2ac0
BLAKE2b-256 a7c6cbbc9605cf0b2af2c7e6fe61fd437491c483ca864c39a35a608e43c8c6c0

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
  • Upload date:
  • Size: 210.9 kB
  • Tags: CPython 3.10, manylinux: glibc 2.17+ ARM64, manylinux: glibc 2.28+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 b874e6d12a8e8034b272c48dd4d44ac9d9afc4f3732d003022318555abf66231
MD5 293bdc3441a57f70f0d1457ec4cb5547
BLAKE2b-256 32e3a6a3e4102c9efc3f8421b012f0ebe25ec33797a3282829e7aec853678ec5

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
  • Upload date:
  • Size: 209.4 kB
  • Tags: CPython 3.10, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 6ac2f6f84df12b7a9c67c76b6e56512be34ef7e418264189f20644a591e4b4b6
MD5 7899a564d7cfa95d1f6e14d7ccf2aa66
BLAKE2b-256 9e020f169efada82cde4098c254bf47a1fe52852ff06811214bf26009c748532

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp310-cp310-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 203.3 kB
  • Tags: CPython 3.10, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 432d9d3ea6cfd54b4cce79604066d008fdb576325645500af9bae8923d141004
MD5 75b5f0f8f4a81cd1ffc6fb6586e705f4
BLAKE2b-256 ee5772aefe0ad7e6d3578c1772a8dc0f1fa0a0e58338fbc02d9bfbcd8fe362ba

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 202.9 kB
  • Tags: CPython 3.10, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 0b99a75c4a9ba05ee44217f967b3d5c37d46a9e973e45e9f57d1542b3e7b827b
MD5 08bcd8c7e43771d2b19b3f7a6b09246f
BLAKE2b-256 661acb4d47d073d0613634fd80b3fcd3134995934a8ff3998062706ed859355a

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
  • Upload date:
  • Size: 210.7 kB
  • Tags: CPython 3.9, manylinux: glibc 2.17+ ARM64, manylinux: glibc 2.28+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 1011a56428b061b536d77eb5e8e29fee874fa81fa5b4c9f75058ef10903cb87e
MD5 caf37787b50fd4b3a08c3115ae2d694a
BLAKE2b-256 c25861201454bb61b6d1889f15f133051ae057ae199a97ab993d7e2d70dab83a

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
  • Upload date:
  • Size: 209.2 kB
  • Tags: CPython 3.9, manylinux: glibc 2.28+ x86-64, manylinux: glibc 2.5+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl
Algorithm Hash digest
SHA256 274b926d915d8e6173735a5b5b759ac38e116df4b4d8258d802f69c8a2a1ac85
MD5 127d57f9bd39bb86483d2ac6ad58bd20
BLAKE2b-256 8d36d892a1890a5dae60bb0dfc49bd1d3374ca62e0edc49f6f2b119467d20177

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp39-cp39-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 203.3 kB
  • Tags: CPython 3.9, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1aa2ebb67c61c00e66ec0335a471ed123bee7bf5d018ac13c636877435a25dcf
MD5 82ec76e0eafcedd20df53cd17c967e32
BLAKE2b-256 6d5b657dce4b90dcaf7309456e67eb60215bc03057ecaffdfa711cbbfded4985

See more details on using hashes here.

File details

Details for the file traffik-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: traffik-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 202.9 kB
  • Tags: CPython 3.9, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.32 {"installer":{"name":"uv","version":"0.11.32","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for traffik-1.2.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f694ed58ce6e1aa829b0bd42377bbb297d9e9bddfebc8b764a38fa021425473f
MD5 4c7a82970f42c34b86878f673a341376
BLAKE2b-256 4de3009b50cd363abac6d8d0f005d98eefa4663cb61290da64d674668942a6f5

See more details on using hashes here.

Release history Release notifications | RSS feed

1.2.2

25 files

This release

1.2.1 This release

25 files

1.2.0

25 files

1.1.0

2 files

1.0.2

2 files

1.0.1

2 files

1.0.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page