poet-api
Requests with Limiter.
Uses pyrate_limiter.SQLiteBucket with use_file_lock=True.
It has a default RATE_LIMIT_SITES setting and waits for settings.DJANGO_RATE_LIMIT_SITES:
Configuration:
DJANGO_RATE_LIMIT_SITES = {
"payment_gateway": {
"domain_keyword": "adomain.com",
"rates": [Rate(25, Duration.MINUTE)],
"max_wait_seconds": 5, # Custom timeout in seconds
},
"analytics_service": {
"domain_keyword": "anotherdomain.com",
"rates": [Rate(50, Duration.MINUTE)],
# No timeout here: default = -1
},
# The following line, already exists as default setting:
# "default": {"rates": [Rate(59, Duration.MINUTE)], "max_wait_seconds": -1},
}
DJANGO_RATE_LIMIT_SITES.keys()[0]: str-> Unique identity keywordDJANGO_RATE_LIMIT_SITES.values()[0]: dict->domain_keyword: str->urlparse(url).netlock or "default". A new autonomous limiter is based on this keyword.rates: list-> List ofRateobjects for thedomain_keywordmax_wait_seconds: int-> Max seconds the limiter can wait before failing.- -1: Wait until the bucket allows a request, the request never fails.
- positive int: If the bucket needs more than
positive intseconds to allow a request, the request fails.- A mocked
HTTP 429 ("Too Many Requests")response object is returned without making an actual request. requests().raise_for_status()raisesrequests.exceptions.HTTPError.
- A mocked
Example
Bare metal use
import requests
from api.rate_limiter import send_request
try:
# 1. Send request
response = send_request("https://example.com", method="POST", json={"amount": 10})
# 2. Raise for error
# If:
# - max_wait_seconds != -1 (-1 is the default)
# - the bucket cannot afford it
# -> a mocked HTTP 429 ("Too Many Requests") response is returned
response.raise_for_status()
# 3. Continue if everything is OK
data = response.json()
print("Success:", data)
except requests.exceptions.HTTPError as e:
print(f"HTTP Error occurred: {e}")
if e.response and e.response.status_code == 429:
print("Reason: The application queue was too full and exceeded max_wait_seconds!")
except Exception as e:
print(f"An unexpected error occurred: {e}")
```
### `api.api_call.call_them`
This method provides a mechanism to retry up to 10 times with backoff strategy.
```python
from api import api_call
from api.protocols import SyncHttpResponse
response: SyncHttpResponse = api_call.call_them(
url="https://www.example.com",
action="GET",
**kwargs,
)
print(f"HTTP Error occurred: {e}")
except Exception as e:
print(f"An unexpected error occurred: {e}")
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
poet_api-4.2.0.tar.gz
(5.8 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file poet_api-4.2.0.tar.gz.
File metadata
- Download URL: poet_api-4.2.0.tar.gz
- Upload date:
- Size: 5.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
poetry/2.4.1 CPython/3.13.13 Linux/6.12.96+deb13-amd64
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
907bf8bc98b6ec39cb3345fe235da7989f43177d4e174bf7545dcaa6debdc298
|
|
| MD5 |
c205339b5215d5f9799c758e1ba58748
|
|
| BLAKE2b-256 |
c5ae084f18d47b2bd93cddc26f7d3c67b4e7dc002b93796884113fdd6bfd7a41
|
File details
Details for the file poet_api-4.2.0-py3-none-any.whl.
File metadata
- Download URL: poet_api-4.2.0-py3-none-any.whl
- Upload date:
- Size: 7.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
poetry/2.4.1 CPython/3.13.13 Linux/6.12.96+deb13-amd64
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3b90824fac8ffa0569a75b21872f2c00190ef31716240b8ee0aceee6aaba8499
|
|
| MD5 |
6becb71bd401753d39bacff361553928
|
|
| BLAKE2b-256 |
aa028ed58cf171c0b37555ca446bf62e7978dc7bfa87ebe8e773b95edbba9cb2
|