Skip to main content

A client framework for HTTP APIs

Project description

Descanso

PyPI version Supported versions Downloads License GitHub Actions Workflow Status Doc Telegram

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:

  1. Install aiohttp (instead of requests)
  2. Change descanso.http.requests.RequestsClient to descanso.http.aiohttp.AiohttpClient
  3. All methods will be async, but you can add async keyword to make it more verbose

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

descanso-0.7.0.tar.gz (40.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

descanso-0.7.0-py3-none-any.whl (24.1 kB view details)

Uploaded Python 3

File details

Details for the file descanso-0.7.0.tar.gz.

File metadata

  • Download URL: descanso-0.7.0.tar.gz
  • Upload date:
  • Size: 40.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"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

Hashes for descanso-0.7.0.tar.gz
Algorithm Hash digest
SHA256 5983317e4b368a14865bd1cbf734ff4954520b83b1b4d76a5e941a3c8821f20a
MD5 ff8dc160fe6e6faa48d1e0419174456f
BLAKE2b-256 f0bb9e31fc1243c044c93520c01783a51f570fb73f908312971bddf66877ad1a

See more details on using hashes here.

File details

Details for the file descanso-0.7.0-py3-none-any.whl.

File metadata

  • Download URL: descanso-0.7.0-py3-none-any.whl
  • Upload date:
  • Size: 24.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.9.13 {"installer":{"name":"uv","version":"0.9.13"},"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

Hashes for descanso-0.7.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b073bbb8f19243cf819e2f41c05196c190f3649960de658bff349bff697f7600
MD5 2f423a0a531b564cc2b75f4583d622c9
BLAKE2b-256 096e432d0fedd1358dab5b617511939baeca8615057e14025083f57f5dea8f99

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page