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

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.2.1.tar.gz (65.8 kB view details)

Uploaded Source

Built Distributions

aio_openapi-2.2.1-py39-none-any.whl (54.6 kB view details)

Uploaded Python 3.9

aio_openapi-2.2.1-py38-none-any.whl (54.6 kB view details)

Uploaded Python 3.8

aio_openapi-2.2.1-py37-none-any.whl (54.6 kB view details)

Uploaded Python 3.7

File details

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

File metadata

  • Download URL: aio-openapi-2.2.1.tar.gz
  • Upload date:
  • Size: 65.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/54.1.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2

File hashes

Hashes for aio-openapi-2.2.1.tar.gz
Algorithm Hash digest
SHA256 b22599f6112b0d5aa973ec0719aae30130696ad49f761e2d79b087f30f4d6230
MD5 34804430cbe16fe13b3afcc8fcb35071
BLAKE2b-256 afee0fadb993d573b356208d992b4831240d5ef1efdd3545d4bb9b558d358d18

See more details on using hashes here.

File details

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

File metadata

  • Download URL: aio_openapi-2.2.1-py39-none-any.whl
  • Upload date:
  • Size: 54.6 kB
  • Tags: Python 3.9
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/54.1.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2

File hashes

Hashes for aio_openapi-2.2.1-py39-none-any.whl
Algorithm Hash digest
SHA256 875dc3820e04b7644d33ad45ecb26652e6371fc1736ddfbfcb5cb88d6bb341b6
MD5 e92738b85431e87a7b31555b3f0d269e
BLAKE2b-256 7adb11346942a63ba6152c5957443fe3aa5d62c04295b416e4dfa986c5832ab3

See more details on using hashes here.

File details

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

File metadata

  • Download URL: aio_openapi-2.2.1-py38-none-any.whl
  • Upload date:
  • Size: 54.6 kB
  • Tags: Python 3.8
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/54.1.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.8

File hashes

Hashes for aio_openapi-2.2.1-py38-none-any.whl
Algorithm Hash digest
SHA256 478fa23a1296bb000ff73829106818193fad431ba8dd58c8656d446d0e887dad
MD5 e3aba58dbba34a0e2209ef2e51cce256
BLAKE2b-256 ecd473c9a1125ae45d671d0d81b3f3d4d04f26dad9ce49f247c41704448c2e83

See more details on using hashes here.

File details

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

File metadata

  • Download URL: aio_openapi-2.2.1-py37-none-any.whl
  • Upload date:
  • Size: 54.6 kB
  • Tags: Python 3.7
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.3.0 pkginfo/1.7.0 requests/2.25.1 setuptools/54.1.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.7.10

File hashes

Hashes for aio_openapi-2.2.1-py37-none-any.whl
Algorithm Hash digest
SHA256 0acba967dfa585bf32e5f6a7f6a4be1d0e39ca087bb0d1a0820dda9b3298cc45
MD5 008abf96cada561ee0492d033b22fb9e
BLAKE2b-256 e02c7a461511e36666ae5888acfe26fe5d9d33cd1d55c597e2dfc0a77437f91b

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