A client framework for HTTP APIs
Project description
Descanso
A modern and simple way to create clients for REST like APIs
If you are looking for
dataclass-rest, this is the same project with a new name.We had reworked it a lot, but old code is still available in a separate branch.
Quickstart
Step 1. Install
pip install descanso requests adaptix
requests and adaptix are optional dependencies, but we will use them in quickstart.
Step 2. Declare models
from dataclasses import dataclass
@dataclass
class Todo:
id: int
user_id: int
title: str
completed: bool
Step 3. Select serialization library. We recommend using adaptix.
You need to have Loader and Dumper implementations, adaptix.Retort would be fine
Step 4. Configure RestBuilder instance. It is needed to reuse common step during request.
from adaptix import Retort
from descanso import RestBuilder
rest = RestBuilder(
request_body_dumper=Retort(),
response_body_loader=Retort(),
query_param_dumper=Retort(),
)
Step 5. Create client class. Use RequestsClient or AiohttpClient
from descanso.http.requests import RequestsClient
class RealClient(RequestsClient):
...
Step 6. Declare methods using rest.get/rest.post/rest.delete/rest.patch/rest.put decorators. You can override RestBuilder params if needed.
Type hints are required. Body of method is ignored.
Use any method arguments to format URL.
body argument is sent as request body with json. Other arguments, not used in the URL are passed as query parameters.
from descanso.http.requests import RequestsClient
class RealClient(RequestsClient):
@rest.get("todos/{id}")
def get_todo(self, id: str) -> Todo:
pass
@rest.get("todos")
def list_todos(self, user_id: int | None) -> list[Todo]:
pass
@rest.delete("todos/{id}")
def delete_todo(self, id: int):
pass
@rest.post("todos")
def create_todo(self, body: Todo) -> Todo:
pass
Step 7. Create client instance and use it.
from requests import Session
client = RealClient(
base_url="https://example.com/api",
session=Session()
)
client.get_todo(5)
Asyncio
To use async client instead of sync:
- Install
aiohttp(instead ofrequests) - Change
descanso.http.requests.RequestsClienttodescanso.http.aiohttp.AiohttpClient - All methods will be async, but you can add
asynckeyword to make it more verbose
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
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 descanso-0.7.1.tar.gz.
File metadata
- Download URL: descanso-0.7.1.tar.gz
- Upload date:
- Size: 40.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.16 {"installer":{"name":"uv","version":"0.9.16","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43fffd408b31a02ebafde56d603ecd0f60886a945d8fb87a3859c993630e7ed5
|
|
| MD5 |
c5edc6e8d0b02d9ac2180a990a93552a
|
|
| BLAKE2b-256 |
6bd529786db6e85c961853f1bbfc9988b7f34c98c2a20479916d8a125095ad48
|
File details
Details for the file descanso-0.7.1-py3-none-any.whl.
File metadata
- Download URL: descanso-0.7.1-py3-none-any.whl
- Upload date:
- Size: 24.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: uv/0.9.16 {"installer":{"name":"uv","version":"0.9.16","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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d3d5509b7f36ab19691ab9f64b7edc51f24739e7f9ea3ec237fb913f0cff5a49
|
|
| MD5 |
21b99b43af80f52ebe7ca467570e2b42
|
|
| BLAKE2b-256 |
2ee9ae2ceeedc2cdadd5fce8ced4d271ad83921f2acd6b82972a45f466746868
|