Skip to main content

An utility for writing simple clients for REST like 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

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.5.0b1.tar.gz (16.2 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.5.0b1-py3-none-any.whl (18.9 kB view details)

Uploaded Python 3

File details

Details for the file descanso-0.5.0b1.tar.gz.

File metadata

  • Download URL: descanso-0.5.0b1.tar.gz
  • Upload date:
  • Size: 16.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for descanso-0.5.0b1.tar.gz
Algorithm Hash digest
SHA256 81cadd4951abfec59a38c766cb4602760bc1cfb000336a64d7c111f0d3aa99fc
MD5 fe4283150b9c3be547f7cbf11c99c536
BLAKE2b-256 c4825631ecb66dcf3df4a183d74533649b78a18a3716907cb180e779531ca6c6

See more details on using hashes here.

File details

Details for the file descanso-0.5.0b1-py3-none-any.whl.

File metadata

  • Download URL: descanso-0.5.0b1-py3-none-any.whl
  • Upload date:
  • Size: 18.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for descanso-0.5.0b1-py3-none-any.whl
Algorithm Hash digest
SHA256 a53e704f2b0f4b934ef2e178c304184320c62a8ee9458aff88e372c470499c41
MD5 9c49e551e49056d09db6ea1f1b4b485d
BLAKE2b-256 b5f83db41dcc45bde4057acac9743f32dcf6dbfb13ddaaa6a21bb87dadca8579

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