Skip to content

kulgan/flaskdoc

Repository files navigation

flaskdoc

PyPi downloads Python versions build Documentation Status license Coverage Code Quality

FlaskDoc allows developers to programmatically compose openapi specifications for flask endpoints as a part of code without needing to write a separate yaml file, and it comes with SwaggerUI embedded. Its main focus is on documentation which frees developers to focus on getting their services coded.

Why flaskdoc

  • Focus only on documentation and not introduce some fancy new way of using flask.
  • Easily add to existing code without needing to refactor of change the way the code has been written
  • Little or no learning curve, as long as a developer is comforatble using flask developers, they can use flaskdoc. to learn quickly and not distract So developers focus on writing code
  • SwaggerUI integration for quickly testing and iterating through versions
  • Automatic data model to JSON Schema transformation that allows for finer grain configuration

Getting Started

Visit documentation page for more details.

Install

from pypi

$ pip install flaskdoc

from github

$ pip install https://github.com/kulgan/flaskdoc/tarball/master

To run examples you will need to install the dev extension

$ pip install flaskdoc[dev]

Register OpenAPI

Add top level openapi objects like Info, Contact, License etc

import flask
from flaskdoc import register_openapi, swagger

app = flask.Flask()
# initialize app, add all the blueprints you care about

# Create top level OpenAPI objects
# the info object
info = swagger.Info(
    title="Test",
    version="1.2.2",
    contact=swagger.Contact(
        name="Rowland", email="[email protected]", url="https://github.com/kulgan"
    ),
    license=swagger.License(name="Apache 2.0", url="https://www.example.com/license"),
)

# servers names and variables if necessary
servers = [swagger.Server(url="http://localhost:15172")]

# top level tags
tags = [
    swagger.Tag(name="admin", description="Secured Admin-Only calls"),
    swagger.Tag(name="developers", description="Operations available to regular developers"),
]

security_schemes = {
    "api_key": swagger.ApiKeySecurityScheme(name="api_key"),
}

# register spec
register_openapi(app, info=info, servers=servers, tags=tags, security=security_schemes)

This adds the following endpoints to your list

  • /docs
  • /docs/openapi.yaml
  • /docs/openapi.json

Start Documenting

Now start documenting you flask routes

A simple post example

blp = flask.Blueprint("Dummy", __name__, url_prefix="/v1")
@swagger.POST(
    tags=["administrator"],
    description="Posts an Echo",
    responses={"201": swagger.ResponseObject(description="OK")},
)
@blp.route("/echo", methods=["POST"])
def post():
    req = flask.request.get_json(force=True)
    return flask.jsonify(req), 200

A GET example with path parameter

blp = flask.Blueprint("Dummy", __name__, url_prefix="/v1")

@swagger.GET(
    tags=["getEcho"],
    operation_id="getEcho",
    parameters=[swagger.PathParameter(name="sample", schema=str)],
    description="Retrieve echos wit Get",
    responses={
        "200": swagger.ResponseObject(
            description="Success", content=jo.PlainText(schema=jo.Email()),
        )
    },
)
@blp.route("/echo/<string:sample>", methods=["GET"])
def echo(sample: str):
    """
    Sample GET request
    Returns: Echos back whatever was sent

    """
    return sample

Run your app and visit /docs to see the generated openapi specs

Running Examples

Two example projects are currently provided

To run

$ pip install flaskdoc[dev]
$ flaskdoc start -n petstore

Contributing

Don't hesitate to create a Github issue for any bugs or suggestions