requests-counter
A tool to monitor the number of HTTP requests.
It uses a key as extra parameter in the HTTP header, and optionally can filter the HTTP request per source (like origin).
Use cases
Scenario: A Company that sell a Service that is limited by a max amount of requests and/or filtered by source HTTP request parameter.
- As a Company, I want to set a request limit for an _apiKey_and/or by source.
- As a Company, I want to update/destroy/inspect the status of subscription via api.
Installation
Requirement
Install redis or run a docker container as below
$> docker run --name test-redis -p6379:6379 -ti redis redis-server --appendonly yes
Package Installation
$> pip install requests-counter
Usage
As request counter for fastapi
from fastapi import Depends, FastAPI, HTTPException, Header
from requests_counter.reqcounter import ReqCounter
import asyncio
app = FastAPI()
cl = ReqCounter("redis://localhost")
asyncio.create_task(cl.setup_api_key([("my-api-key-test", 100)]))
asyncio.create_task(cl.setup_source(["source1", "source2"]))
async def check_key(apiKey: str = Header(None), source: str = Header(None)):
res = await cl.decrease(apiKey)
if res is False:
raise HTTPException(400, "User Requests Limit Exceeded")
if await cl.check_source(source) is False:
raise HTTPException(403, "Forbidden")
return apiKey
@app.get("/consume")
async def consume_key(apiKey=Depends(check_key)):
return {"job": "done", "apiKey": apiKey}
To run this example
$> uvicorn requests_counter.example:app --reload --port 8080
As endpoint
Command below run the server to interact with your redis instance for
- Destroy a key
- Update the value (i.e. renewal)
- Get the status of all keys
$> uvicorn requests_counter.api:app --reload --port 8080
Run http://locahost:8080/docs
for documentation.