Skip to main content

An utility for writing simple clients for REST like APIs

Project description

Dataclass REST

PyPI version Build Status

A modern and simple way to create clients for REST like APIs

Quickstart

Step 1. Install

pip install dataclass_rest requests

Step 2. Declare models

@dataclass
class Todo:
    id: int
    user_id: int
    title: str
    completed: bool

Step 3. Create and configure client

from requests import Session
from dataclass_rest.http.requests import RequestsClient

class RealClient(RequestsClient):
    def __init__(self):
        super().__init__("https://example.com/api", Session())

Step 4. Declare methods using get/post/delete/patch/put decorators. 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 URL are passed as query parameters. get and delete does not have body.

from typing import Optional, List
from requests import Session
from dataclass_rest import get, post, delete
from dataclass_rest.http.requests import RequestsClient

class RealClient(RequestsClient):
    def __init__(self):
        super().__init__("https://example.com/api", Session())

    @get("todos/{id}")
    def get_todo(self, id: str) -> Todo:
        pass

    @get("todos")
    def list_todos(self, user_id: Optional[int]) -> List[Todo]:
        pass

    @delete("todos/{id}")
    def delete_todo(self, id: int):
        pass

    @post("todos")
    def create_todo(self, body: Todo) -> Todo:
        """Создаем Todo"""

Asyncio

To use async client insted of sync:

  1. Install aiohttp (instead of requests)
  2. Change dataclass_rest.http.requests.RequestsClient to dataclass_rest.http.aiohttp.AiohttpClient
  3. Add async keyword to your methods

Configuration

Parsing and serialization

All parsing and serialization is done using instances of FactoryProtocol. They are create by client object during its initialization. Default implementation creates Retort from adaptix

There are 3 of them:

  1. Request body factory. Created using _init_request_body_factory. It is used to convert body object to simple python classes before senging to the server
  2. Request args factory. Created using _init_request_args_factory. It is used to convert other parameters of method. All parameters are passed as a single object. Type of that object is generated and can be retrieved from your client methods using .methodspec.query_params_type
  3. Response body factory. Created using _init_response_body_factory. It is used to parse a server response.

Error handling

You can attach error handler to single method using @yourmethod.on_error decorator in your class.

To set same behavior for all methods inherit from BoundMethod class, override _on_error_default method and set that class as Client.method_class

Other params

You can use different body argument name if you want. Just pass body_name to the decorator.

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

dataclass_rest-0.4.tar.gz (8.7 kB view hashes)

Uploaded Source

Built Distribution

dataclass_rest-0.4-py3-none-any.whl (10.4 kB view hashes)

Uploaded Python 3

Supported by

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