⚜️ Clientele
Example code
from clientele import api
from pydantic import BaseModel
client = api.APIClient(base_url="https://pokeapi.co/api/v2/")
class Pokemon(BaseModel):
name: str
@client.get("/pokemon/{id}")
def get_pokemon_name(id: int, result: Pokemon) -> str:
return result.name
Why use Clientele?
- A comfortable abstraction - Encourages consistency and focus on the functionality.
- Easy to learn - Clientele is visually similar to popular python API server frameworks.
- Easy to test - Comes with built-in testing tools, and works with existing libraries like respx and pytest-httpx.
- Easy to configure - Clientele has sensible defaults and plenty of hooks for customisation.
- Easy data validation - Built in data validation using Pydantic.
- Use your own HTTP - Clientele can support all HTTP libraries.
- OpenAPI support - Build your own client, or scaffold one from an OpenAPI schema.
Async support
@client.get("/pokemon/{id}")
async def get_pokemon_name(id: int, result: Pokemon) -> str:
return result.name
Automatic data validation
from clientele import api as clientele_api
from .my_pydantic_models import CreateBookRequest, CreateBookResponse
client = clientele_api.APIClient(base_url="http://localhost:8000")
@client.post("/books")
def create_book(data: CreateBookRequest, result: CreateBookResponse) -> CreateBookResponse:
return result
Streaming responses
from typing import AsyncIterator
from clientele import api
from pydantic import BaseModel
client = api.APIClient(base_url="https://httpbin.org")
class Event(BaseModel):
id: int
url: str
@client.get("/stream/{n}", streaming_response=True)
async def stream_events(n: int, result: AsyncIterator[Event]) -> AsyncIterator[Event]:
return result
Direct requests
result = client.request(
"GET",
"pokemon/{pokemon_id}",
response_map={200: Pokemon},
pokemon_id=1
)
Works with Python API frameworks
Built and tested to be 100% compatible with the OpenAPI schemas generated from:
- FastAPI
- Django REST Framework via drf-spectacular
- Django Ninja
See the working demos in our server_examples/ directory.
OpenAPI support
Clientele can create scaffolding for an API client from an OpenAPI schema with:
- Pydantic models generated from the schema objects.
- Decorated function signatures generated from schema operations.
- Async support if you want a client with concurrency.
- A tiny output that is only 3 files big.
- Regeneration-friendly - update your API, regenerate, review the git diff, then ship it!
- Formatted code thanks to Ruff.
Getting Started
👉 Read the full documentation for all documentation.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
clientele-1.8.1.tar.gz
(1.9 MB
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
clientele-1.8.1-py3-none-any.whl
(102.7 kB
view details)
File details
Details for the file clientele-1.8.1.tar.gz.
File metadata
- Download URL: clientele-1.8.1.tar.gz
- Upload date:
- Size: 1.9 MB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a7d148e47719824eadd5351adbb61ce2ad0668148fe552143e8f584bcf0345e
|
|
| MD5 |
e646f6bfed89a0532b6de28f5b0ee4a9
|
|
| BLAKE2b-256 |
c306a40cc2f902c407718908e9615e069de0bcee7c6b4abc85cdfe9bf2c082d3
|
File details
Details for the file clientele-1.8.1-py3-none-any.whl.
File metadata
- Download URL: clientele-1.8.1-py3-none-any.whl
- Upload date:
- Size: 102.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.6
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc09da1553533bcc26a5b01f143c90db1187fef6d1229dc6b0c6069b72a3d556
|
|
| MD5 |
971cebd72214416853bf8d4ed9f154fd
|
|
| BLAKE2b-256 |
ef23543182835595c6008268dcdc4e71deee86e550fbe8aee2d3e33caeb5021a
|