![my-logo](https://jonahtzuchi.github.io/rate-limiter/logo-mini.jpg "pygrl-Logo")
# PYGRL - Python General Rate Limiter
Another Python package aim to offer "Rate Limiting" functionality for general use cases.
# Features
- Flexible storage strategy (Memory | File | Database)
- MemoryStorage
- `BasicStorage`
- FileStorage
- `SQLite3_Storage`
- Cleanup expired rate limiters
- Use as a decorator
- Use as a variable
- Compatible with fastapi (TO BE TESTED)
- Support asynchronous DB operations (TODO)
# Dependencies
- Python 3.10
# Installation
```bash
pip3 install pygrl
```
# Example - BasicStorage
## Imports
```python
from pygrl import BasicStorage, GeneralRateLimiter as grl, ExceededRateLimitError
```
# Check limit with BasicStorage
```python
storage = BasicStorage()
rate_limiter = grl(storage, 10, 1)
try:
for i in range(12):
allowed_to_pass = rate_limiter.check_limit("client-key")
if allowed_to_pass:
print(f"Request {i + 1}: Allowed")
else:
print(f"Request {i + 1}: Exceeded rate limit")
except Exception as e:
print(f"Rate limit exceeded: {e}")
```
## Apply rate limiter decorator with BasicStorage
```python
@grl.general_rate_limiter(storage=BasicStorage(), max_requests=10, time_window=1)
def fn(a, b):
return a + b
try:
for i in range(12):
result = fn(i, i + 1)
print(f"Result {i + 1}: {result}")
except ExceededRateLimitError as e:
print(f"Rate limit exceeded: {e}")
```
# Apply rate limiter decorator with BasicStorage (Keyed function)
```python
import random
@grl.general_rate_limiter(storage=BasicStorage(), max_requests=2, time_window=1)
def connect(key: str, host: str, port: int):
return f"{key} connected to {host}:{port}"
users = ["Alice", "Bob", "Charlie", "David", "Eve"]
try:
for i in range(12):
user = random.choice(users)
result = connect(key=user, host="localhost", port=3306)
print(f"Result: {result}")
except ExceededRateLimitError as e:
print(f"Rate limit exceeded: {e}")
```
# Example - SQLite3_Storage
## Imports
```python
from pygrl import SQLite3_Storage, GeneralRateLimiter as grl, ExceededRateLimitError
```
## Check limit with SQLite3_Storage
```python
storage = SQLite3_Storage("storage1.db", overwrite=True)
rate_limiter = grl(storage, 10, 1)
try:
for i in range(12):
allowed_to_pass = rate_limiter.check_limit("client-key")
if allowed_to_pass:
print(f"Request {i + 1}: Allowed")
else:
print(f"Request {i + 1}: Exceeded rate limit")
except Exception as e:
print(f"Rate limit exceeded: {e}")
```
## Apply rate limiter decorator with SQLite3_Storage
```python
@grl.general_rate_limiter(storage=SQLite3_Storage("storage2.db", overwrite=True), max_requests=10, time_window=1)
def fn(a, b):
return a + b
try:
for i in range(12):
result = fn(i, i + 1)
print(f"Result {i + 1}: {result}")
except ExceededRateLimitError as e:
print(f"Rate limit exceeded: {e}")
```
## Apply rate limiter decorator with SQLite3_Storage (Keyed function)
```python
import random
@grl.general_rate_limiter(storage=SQLite3_Storage("storage3.db", overwrite=True), max_requests=2, time_window=1)
def connect(key: str, host: str, port: int):
return f"{key} connected to {host}:{port}"
users = ["Alice", "Bob", "Charlie", "David", "Eve"]
try:
for i in range(12):
user = random.choice(users)
result = connect(key=user, host="localhost", port=3306)
print(f"Result: {result}")
except ExceededRateLimitError as e:
print(f"Rate limit exceeded: {e}")
```
# Source Code
- https://github.com/JonahTzuChi/rate-limiter
Raw data
{
"_id": null,
"home_page": null,
"name": "pygrl",
"maintainer": null,
"docs_url": null,
"requires_python": null,
"maintainer_email": null,
"keywords": "python, rate, limiter, rate limiter, rate limiting",
"author": "jonah_whaler_2348",
"author_email": "jk_saga@proton.me",
"download_url": "https://files.pythonhosted.org/packages/11/3a/33749073777e501f085b0afd0f6a5201042741dfeddcbc30c8e412ca7114/pygrl-0.0.3.1.tar.gz",
"platform": null,
"description": "![my-logo](https://jonahtzuchi.github.io/rate-limiter/logo-mini.jpg \"pygrl-Logo\")\n\n# PYGRL - Python General Rate Limiter\nAnother Python package aim to offer \"Rate Limiting\" functionality for general use cases.\n\n# Features\n- Flexible storage strategy (Memory | File | Database)\n - MemoryStorage\n - `BasicStorage`\n - FileStorage\n - `SQLite3_Storage`\n- Cleanup expired rate limiters\n- Use as a decorator\n- Use as a variable\n- Compatible with fastapi (TO BE TESTED)\n- Support asynchronous DB operations (TODO)\n\n# Dependencies\n- Python 3.10\n\n# Installation\n```bash\npip3 install pygrl\n```\n\n# Example - BasicStorage\n\n## Imports\n```python\nfrom pygrl import BasicStorage, GeneralRateLimiter as grl, ExceededRateLimitError\n```\n\n# Check limit with BasicStorage\n```python\nstorage = BasicStorage()\nrate_limiter = grl(storage, 10, 1)\ntry:\n for i in range(12):\n allowed_to_pass = rate_limiter.check_limit(\"client-key\")\n if allowed_to_pass:\n print(f\"Request {i + 1}: Allowed\")\n else:\n print(f\"Request {i + 1}: Exceeded rate limit\")\nexcept Exception as e:\n print(f\"Rate limit exceeded: {e}\")\n```\n\n## Apply rate limiter decorator with BasicStorage\n```python\n@grl.general_rate_limiter(storage=BasicStorage(), max_requests=10, time_window=1)\ndef fn(a, b):\n return a + b\n\ntry:\n for i in range(12):\n result = fn(i, i + 1)\n print(f\"Result {i + 1}: {result}\")\nexcept ExceededRateLimitError as e:\n print(f\"Rate limit exceeded: {e}\")\n```\n\n# Apply rate limiter decorator with BasicStorage (Keyed function)\n```python\nimport random\n\n@grl.general_rate_limiter(storage=BasicStorage(), max_requests=2, time_window=1)\ndef connect(key: str, host: str, port: int):\n return f\"{key} connected to {host}:{port}\"\n\nusers = [\"Alice\", \"Bob\", \"Charlie\", \"David\", \"Eve\"]\ntry:\n for i in range(12):\n user = random.choice(users)\n result = connect(key=user, host=\"localhost\", port=3306)\n print(f\"Result: {result}\")\nexcept ExceededRateLimitError as e:\n print(f\"Rate limit exceeded: {e}\")\n```\n\n# Example - SQLite3_Storage\n\n## Imports\n```python\nfrom pygrl import SQLite3_Storage, GeneralRateLimiter as grl, ExceededRateLimitError\n```\n\n## Check limit with SQLite3_Storage\n```python\nstorage = SQLite3_Storage(\"storage1.db\", overwrite=True)\nrate_limiter = grl(storage, 10, 1)\ntry:\n for i in range(12):\n allowed_to_pass = rate_limiter.check_limit(\"client-key\")\n if allowed_to_pass:\n print(f\"Request {i + 1}: Allowed\")\n else:\n print(f\"Request {i + 1}: Exceeded rate limit\")\nexcept Exception as e:\n print(f\"Rate limit exceeded: {e}\")\n```\n\n## Apply rate limiter decorator with SQLite3_Storage\n```python\n@grl.general_rate_limiter(storage=SQLite3_Storage(\"storage2.db\", overwrite=True), max_requests=10, time_window=1)\ndef fn(a, b):\n return a + b\n\ntry:\n for i in range(12):\n result = fn(i, i + 1)\n print(f\"Result {i + 1}: {result}\")\nexcept ExceededRateLimitError as e:\n print(f\"Rate limit exceeded: {e}\")\n```\n\n## Apply rate limiter decorator with SQLite3_Storage (Keyed function)\n```python\nimport random\n\n@grl.general_rate_limiter(storage=SQLite3_Storage(\"storage3.db\", overwrite=True), max_requests=2, time_window=1)\ndef connect(key: str, host: str, port: int):\n return f\"{key} connected to {host}:{port}\"\n\nusers = [\"Alice\", \"Bob\", \"Charlie\", \"David\", \"Eve\"]\ntry:\n for i in range(12):\n user = random.choice(users)\n result = connect(key=user, host=\"localhost\", port=3306)\n print(f\"Result: {result}\")\nexcept ExceededRateLimitError as e:\n print(f\"Rate limit exceeded: {e}\")\n```\n\n# Source Code\n- https://github.com/JonahTzuChi/rate-limiter\n\n\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Another Python package aim to offer \"Rate Limiting\" functionality for general use cases.",
"version": "0.0.3.1",
"project_urls": null,
"split_keywords": [
"python",
" rate",
" limiter",
" rate limiter",
" rate limiting"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "8959957b65c8e3206d774d382dbb299f356292ef8278ee0659aa8da7d73d1756",
"md5": "9e9d74d57349312e34c744cb7bac394c",
"sha256": "d466607b3a8628b096c822bafe4dbd63416667887a003c26664e5fb2e34ff325"
},
"downloads": -1,
"filename": "pygrl-0.0.3.1-py3-none-any.whl",
"has_sig": false,
"md5_digest": "9e9d74d57349312e34c744cb7bac394c",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 9920,
"upload_time": "2024-05-28T03:04:22",
"upload_time_iso_8601": "2024-05-28T03:04:22.574374Z",
"url": "https://files.pythonhosted.org/packages/89/59/957b65c8e3206d774d382dbb299f356292ef8278ee0659aa8da7d73d1756/pygrl-0.0.3.1-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "113a33749073777e501f085b0afd0f6a5201042741dfeddcbc30c8e412ca7114",
"md5": "f4681e28c0a673ecf274073dfbaf2ac7",
"sha256": "7f89edb99e9b8ab326ffed8426698022969e90eb839fcab7cea7f231ff50f2bc"
},
"downloads": -1,
"filename": "pygrl-0.0.3.1.tar.gz",
"has_sig": false,
"md5_digest": "f4681e28c0a673ecf274073dfbaf2ac7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 7498,
"upload_time": "2024-05-28T03:04:24",
"upload_time_iso_8601": "2024-05-28T03:04:24.559224Z",
"url": "https://files.pythonhosted.org/packages/11/3a/33749073777e501f085b0afd0f6a5201042741dfeddcbc30c8e412ca7114/pygrl-0.0.3.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-05-28 03:04:24",
"github": false,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"lcname": "pygrl"
}