Flask + marshmallow + OpenAPI
Project description
Overview
Provides OpenAPI documentation generated from code for Flask APIs built around marshmallow schemas.
This hackish and organically grown (TM) package was created because no other similar projects worked exactly the way I wanted them.
You will probably be better served by some other, properly maintained project with similar purpose:
If you still want to use it, welcome aboard :-) and read on!
Installation
pip install flask-marshmallow-openapi
Example
See example application. Following is incomplete excerpt to demonstrate:
import flask
import marshmallow as ma
from flask_marshmallow_openapi import OpenAPI, OpenAPISettings, open_api
class SchemaOpts(ma.SchemaOpts):
def __init__(self, meta, *args, **kwargs):
self.tags = getattr(meta, "tags", [])
self.url_id_field = getattr(meta, "url_id_field", None)
super().__init__(meta, *args, **kwargs)
class BookSchema(ma.Schema):
OPTIONS_CLASS = SchemaOpts
class Meta:
url_id_field = "id"
tags = ["Books"]
description = "Schema for Book model"
id = ma.fields.Integer(as_string=True)
title = ma.fields.String(
allow_none=False, metadata={"description": "book.title description"}
)
publisher = ma.fields.String(allow_none=False)
isbn = ma.fields.String(allow_none=False)
app = flask.Flask(__name__)
@app.route("/books", methods=["GET"])
@open_api.get(BookSchema, "bookList", many=True)
def books_list():
return "<p>Hello, World!</p>"
@app.route("/books/<int:book_id>", methods=["GET"])
@open_api.get(BookSchema, "bookDetail", many=False)
def books_detail(book_id):
"""
description: |
Look I can Markdown!
| foo | bar | baz |
| --- | --- | --- |
| 1 | 2 | 3 |
| 4 | 5 | 6 |
"""
return "<p>Hello, World!</p>"
conf = OpenAPISettings(
api_version="v1",
api_name="Foobar API",
app_package_name="foobar_api",
mounted_at="/v1",
)
docs = OpenAPI(config=conf)
docs.init_app(app)
Serving docs via ngnix
Add collect-static
command to your app:
import shutil
import click
import flask
@app.cli.command("collect_static")
@click.argument(
"destination_dir",
nargs=1,
type=click.Path(file_okay=False, dir_okay=True, writable=True, resolve_path=True),
required=True,
)
def collect_static_command(destination_dir):
shutil.copytree(
flask.current_app.static_folder, destination_dir, dirs_exist_ok=True
)
docs.collect_static(destination_dir)
click.echo(f"Static files collected into {destination_dir}.")
Configure nginx
:
server {
# ...
location ^~ /v1/static {
alias /home/user/static;
try_files $uri $uri.html =404;
}
location ^~ /v1/docs {
alias /home/user/static/docs;
try_files $uri $uri.html =404;
}
# ...
}
Whenever deploying app, call:
flask --app foobar_api collect-static /home/user/static
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
Built Distribution
File details
Details for the file flask-marshmallow-openapi-0.1.6.tar.gz
.
File metadata
- Download URL: flask-marshmallow-openapi-0.1.6.tar.gz
- Upload date:
- Size: 972.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f21d8da1491456581873194feb8f1eda580a32aa45f61e5d24d523c87b94ef8e |
|
MD5 | f215bf9c565f97eb6bfd75399fbbcab8 |
|
BLAKE2b-256 | 2f42334de3e0fe101a9ef6adbc30f7746a15ae0b430d51c2178e6756a71e3f72 |
File details
Details for the file flask_marshmallow_openapi-0.1.6-py3-none-any.whl
.
File metadata
- Download URL: flask_marshmallow_openapi-0.1.6-py3-none-any.whl
- Upload date:
- Size: 977.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.10.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | bd9cc0b24a6776cd1948475db01f727d5179f8ec1d94ef942d5c797a960f2301 |
|
MD5 | d8a997cf53b977400f0329122dd3baf7 |
|
BLAKE2b-256 | 9008cd5d53fd0be9ba9dc52663757cffdb8e3105535ca4822a4e6d6feaeb4c71 |