Skip to main content

apidaora

apidaora

HTTP/REST API using dataclasses and TypedDict annotation for python


Documentation: https://dutradda.github.io/apidaora

Source Code: https://github.com/dutradda/apidaora


Key Features

  • Declare request objects as @jsondaora (can be TypedDict or @dataclass):

    • PathArgs for values on path
    • Query for values on query string
    • Headers for values on headers
    • Body for values on body
  • Declare response objects as @jsondaora (can be TypedDict or @dataclass):

    • Headers for values on headers
    • Body for values on body

Requirements

  • Python 3.7+
  • jsondaora for json validation/parsing
  • orjson for json/bytes serialization (jsondaora dependency)

Instalation

$ pip install apidaora

Basic example

from http import HTTPStatus
from typing import TypedDict

from jsondaora import jsondaora

from apidaora import JSONResponse, MethodType, Request, Route, asgi_app


@jsondaora
class MyQuery(TypedDict):
    name: str


@jsondaora
class MyRequest(Request):
    query: MyQuery


@jsondaora
class MyResponseBody(TypedDict):
    message: str


@jsondaora
class MyResponse(JSONResponse):
    body: MyResponseBody


def hello_controller(req: MyRequest) -> MyResponse:
    name = req.query['name']
    body = MyResponseBody(message=f'Hello {name}!')
    return MyResponse(HTTPStatus.OK, body=body)


app = asgi_app([Route('/hello', MethodType.GET, hello_controller)])

Running the server (needs uvicorn installed):

uvicorn myapp:app
INFO: Started server process [16220]
INFO: Waiting for application startup.
INFO: ASGI 'lifespan' protocol appears unsupported.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

Quering the server (needs curl installed):

curl -i localhost:8000/hello?name=World
HTTP/1.1 200 OK
date: Thu, 1st January 1970 00:00:00 GMT
server: uvicorn
content-type: application/json
content-length: 26

{"message":"Hello World!"}

Example for complete request/response

from http import HTTPStatus
from typing import TypedDict

from jsondaora import integer, jsondaora, string

from apidaora import JSONResponse, MethodType, Request, Route, asgi_app


@jsondaora
class MyPathArgs(TypedDict):
    name: str


@jsondaora
class MyQuery(TypedDict):
    location: str


@jsondaora
class MyHeaders(TypedDict):
    x_req_id: str


@jsondaora
class MyBody(TypedDict):
    last_name: str
    age: int


@jsondaora
class MyRequest(Request):
    path_args: MyPathArgs
    query: MyQuery
    headers: MyHeaders
    body: MyBody


# if the class is not a TypedDict, jsondaora
# will create a dataclass from it
@jsondaora
class You:
    name: str
    last_name: str
    location: string(max_length=100)
    age: integer(minimum=18)


@jsondaora
class MyResponseBody(TypedDict):
    hello_message: str
    about_you: You


@jsondaora
class MyResponse(JSONResponse):
    body: MyResponseBody
    headers: MyHeaders


def hello_controller(req: MyRequest) -> MyResponse:
    body = MyResponseBody(
        hello_message=hello_message(
            req.path_args['name'], req.query['location']
        ),
        about_you=You(
            name=req.path_args['name'],
            last_name=req.body['last_name'],
            location=req.query['location'],
            age=req.body['age'],
        ),
    )
    headers = MyHeaders(x_req_id=req.headers['x_req_id'])
    return MyResponse(HTTPStatus.OK, body=body, headers=headers)


def hello_message(name: str, location: str) -> str:
    return f'Hello {name}! Welcome to {location}!'


app = asgi_app([Route('/hello/{name}', MethodType.PUT, hello_controller)])

Running the server:

uvicorn myapp:app
INFO: Started server process [16220]
INFO: Waiting for application startup.
INFO: ASGI 'lifespan' protocol appears unsupported.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)

Quering the server:

curl -i -X PUT localhost:8000/hello/Me?location=World \
    -H 'x-req-id: 1a2b3c4d5e6f7g8h' \
    -d '{"last_name":"My Self","age":32}'
HTTP/1.1 200 OK
date: Thu, 1st January 1970 00:00:00 GMT
server: uvicorn
x-req-id: 1a2b3c4d5e6f7g8h
content-type: application/json
content-length: 123

{"hello_message":"Hello Me! Welcome to World!","about_you":{"name":"Me","last_name":"My Self","location":"World","age":32}}

Download files

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

Source Distribution

apidaora-0.5.0.tar.gz (23.9 kB view details)

Uploaded Source

Built Distribution

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

apidaora-0.5.0-py3-none-any.whl (27.8 kB view details)

Uploaded Python 3

File details

Details for the file apidaora-0.5.0.tar.gz.

File metadata

  • Download URL: apidaora-0.5.0.tar.gz
  • Upload date:
  • Size: 23.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.22.0

File hashes

Hashes for apidaora-0.5.0.tar.gz
Algorithm Hash digest
SHA256 c61b4746639d2fcd05f5d35ec3f63a69b946e231c926180905336e5fc3e66350
MD5 bdafb143f61bf6ec4b7424b47e45b56f
BLAKE2b-256 c5f5258abe0c6363e2038a0ac551f9510ead9ea2695d3b9e204c6690be05cef6

See more details on using hashes here.

File details

Details for the file apidaora-0.5.0-py3-none-any.whl.

File metadata

  • Download URL: apidaora-0.5.0-py3-none-any.whl
  • Upload date:
  • Size: 27.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-requests/2.22.0

File hashes

Hashes for apidaora-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9227edda96a86c4f34b29bbbaf97c0759066bdc67bc1650ede001cea06f14cb6
MD5 024c5f5d4a0b550933a025c2b17f76ee
BLAKE2b-256 650cfa81c93dda71ac48154c5ce49ed090398dd7d721bc81310438a68f9f0f82

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 Sentry Error logging StatusPage Status page