Skip to main content

Minimal OpenAPI asynchronous server application

Project description

aio-openapi

PyPI version Python versions Build Coverage Status Documentation Status Downloads

Asynchronous web middleware for aiohttp and serving Rest APIs with OpenAPI v 3 specification and with optional PostgreSql database bindings.

Table of Contents

Installation

pip install aio-openapi

Development

Clone the repository and create a virtual environment venv.

Install dependencies by running the install script

./dev/install

To run tests

pytest --cov

By default tests are run against a database with the following connection string postgresql://postgres:postgres@localhost:5432/openapi. To use a different DB, create a .env file with a different connection string, for example:

DATASTORE=postgresql://postgres:postgres@localhost:6432/openapi

Features

  • Asynchronous web routes with aiohttp
  • Data validation, serialization and unserialization with python dataclasses
  • OpenApi v 3 auto documentation
  • SqlAlchemy expression language
  • Asynchronous DB interaction with asyncpg
  • Migrations with alembic
  • SqlAlchemy tables as python dataclasses
  • Support click command line interface
  • Optional sentry middleware

Web App

To create an openapi RESTful application follow this schema (lets call the file main.py)

from openapi.rest import rest

def create_app():
    return rest(
        openapi=dict(
            title='A REST API',
            ...
        ),
        base_path='/v1',
        allowed_tags=[...],
        validate_docs=True,
        setup_app=setup_app,
        commands=[...]
    )


def setup_app(app):
    app.router.add_routes(...)
    return app


if __name__ == '__main__':
    create_app().main()

The create_app function creates the aiohttp server application by invoking the rest function. This function adds the click command in the cli mapping entry and add documentation for routes which support OpenAPI docs. The setup_app function is used to actually setup the custom application, usually by adding middleware, routes, shutdown callbacks, database integration and so forth.

OpenAPI Documentation

The library provide tools for creating OpenAPI v 3 compliant endpoints and auto-document them.

An example from test tests/example directory

from typing import List

from aiohttp import web

from openapi.db.path import SqlApiPath
from openapi.spec import op


routes = web.RouteTableDef()


@routes.view('/tasks')
class TasksPath(SqlApiPath):
    """
    ---
    summary: Create and query Tasks
    tags:
        - name: Task
          description: Task tag description
    """
    table = 'tasks'

    @op(query_schema=TaskOrderableQuery, response_schema=List[Task])
    async def get(self) -> web.Response:
        """
        ---
        summary: Retrieve Tasks
        description: Retrieve a list of Tasks
        responses:
            200:
                description: Authenticated tasks
        """
        paginated = await self.get_list()
        return paginated.json_response()

    @op(response_schema=Task, body_schema=TaskAdd)
    async def post(self) -> web.Response:
        """
        ---
        summary: Create a Task
        description: Create a new Task
        responses:
            201:
                description: the task was successfully added
            422:
                description: Failed validation
        """
        data = await self.create_one()
        return self.json_response(data, status=201)

Database Integration

This library provides integration with asyncpg, an high performant asynchronous connector with PostgreSql database. To add the database extension simply use the get_db function in the applicatiuon setup_app function:

from aiohttp import web

from openapi.db import get_db

def setup_app(app: web.Application) -> None:
    db = get_db(app)
    meta = db.metadata

This will enable database connection and command line tools (most of them from alembic):

python main.py db --help

The database container is available at the db app key:

app['db']

Environment Variables

Several environment variables are used by the library to support testing and deployment.

  • DATASTORE: PostgreSql connection string (same as SqlAlchemy syntax)
  • DBPOOL_MIN_SIZE: minimum size of database connection pool (default is 10)
  • DBPOOL_MAX_SIZE: maximum size of database connection pool (default is 10)

Project details


Release history Release notifications | RSS feed

This version

2.1.0

Download files

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

Source Distribution

aio-openapi-2.1.0.tar.gz (66.5 kB view details)

Uploaded Source

Built Distributions

aio_openapi-2.1.0-py39-none-any.whl (55.5 kB view details)

Uploaded Python 3.9

aio_openapi-2.1.0-py38-none-any.whl (55.5 kB view details)

Uploaded Python 3.8

aio_openapi-2.1.0-py37-none-any.whl (55.5 kB view details)

Uploaded Python 3.7

aio_openapi-2.1.0-py36-none-any.whl (55.5 kB view details)

Uploaded Python 3.6

File details

Details for the file aio-openapi-2.1.0.tar.gz.

File metadata

  • Download URL: aio-openapi-2.1.0.tar.gz
  • Upload date:
  • Size: 66.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.9.1

File hashes

Hashes for aio-openapi-2.1.0.tar.gz
Algorithm Hash digest
SHA256 dd149645734f22d828de1eb470b9cb5c9013b6f6240d9c863fee97b49ec4bc8e
MD5 d92d644be92fd4a07da34b4e22522154
BLAKE2b-256 e4b7ca7da44a5ceee8b3009917b99bb69100755cdfcca009b1b4adc6e3208d1d

See more details on using hashes here.

File details

Details for the file aio_openapi-2.1.0-py39-none-any.whl.

File metadata

  • Download URL: aio_openapi-2.1.0-py39-none-any.whl
  • Upload date:
  • Size: 55.5 kB
  • Tags: Python 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.9.1

File hashes

Hashes for aio_openapi-2.1.0-py39-none-any.whl
Algorithm Hash digest
SHA256 3f508678a7c20eb4e8a3442fd6bf436ceb30cb396fb4061c6a85be12f1b4412a
MD5 7667759989bc5543eac08938f29ca711
BLAKE2b-256 27090c3b6903b87e3101aa2b601bc7666c6d3b469f46da54c78e801554c36f6d

See more details on using hashes here.

File details

Details for the file aio_openapi-2.1.0-py38-none-any.whl.

File metadata

  • Download URL: aio_openapi-2.1.0-py38-none-any.whl
  • Upload date:
  • Size: 55.5 kB
  • Tags: Python 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.8.6

File hashes

Hashes for aio_openapi-2.1.0-py38-none-any.whl
Algorithm Hash digest
SHA256 d3a27fce93fae0f469f070eed6987ade96c69fd9117d1570b51af1dd5560c4ae
MD5 99a9ac18cffb9c7dfe75bb0383fe20e9
BLAKE2b-256 4ef4485be5ec10c6dc8e7b130cf24a278d36429c0f2bb4c1b936ccdce28efe4e

See more details on using hashes here.

File details

Details for the file aio_openapi-2.1.0-py37-none-any.whl.

File metadata

  • Download URL: aio_openapi-2.1.0-py37-none-any.whl
  • Upload date:
  • Size: 55.5 kB
  • Tags: Python 3.7
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.7.9

File hashes

Hashes for aio_openapi-2.1.0-py37-none-any.whl
Algorithm Hash digest
SHA256 f334eae52d69598e40633d8ac87d3d36d1546e8ec62540b3ec9c04f393717630
MD5 d8e22be9444569637964230c36a67325
BLAKE2b-256 a250c94a8afabd6d5325993c4f4296e81ea53e1d387c5de5d4c5fd38075b1f03

See more details on using hashes here.

File details

Details for the file aio_openapi-2.1.0-py36-none-any.whl.

File metadata

  • Download URL: aio_openapi-2.1.0-py36-none-any.whl
  • Upload date:
  • Size: 55.5 kB
  • Tags: Python 3.6
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.55.1 CPython/3.6.12

File hashes

Hashes for aio_openapi-2.1.0-py36-none-any.whl
Algorithm Hash digest
SHA256 1eb50624e5ff9719424aecbe72d8203f3c4c87515eb843acaf8b7f30a225a811
MD5 6a5a0832f3d9b8d6e72b8fdc16fa82f0
BLAKE2b-256 be607a889eff5ce8abb0a1f428aaacf509c68d4592ecd1350db0e0dfae4a8b93

See more details on using hashes here.

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