Skip to main content

Swagger UI for Flask - Automatically configure Swagger UI for Flask applications, just like FastAPI's /docs endpoint

Project description

SwagFlask 🎉

Swagger UI for Flask - Bring FastAPI's beloved /docs experience to Flask!

SwagFlask automatically configures Swagger UI for your Flask applications, making API documentation and testing as easy as typing /docs in your browser.

License: MIT Python Flask

✨ Features

  • 🚀 FastAPI-like /docs endpoint for Flask
  • 📝 Automatic OpenAPI/Swagger spec generation from your Flask routes
  • 🎨 Beautiful Swagger UI interface for testing APIs
  • 🔧 Simple decorator-based API documentation
  • 📦 Zero config required - works out of the box
  • 🎯 Type-safe with full type hints support
  • 🔌 Easy integration with existing Flask apps

📦 Installation

pip install swagflask

🚀 Quick Start

from flask import Flask, jsonify
from swagflask import SwaggerUI

app = Flask(__name__)

# Initialize SwaggerUI
swagger = SwaggerUI(app, title="My API", version="1.0.0")

@app.route('/users', methods=['GET'])
@swagger.doc({
    'summary': 'Get all users',
    'responses': {
        '200': {'description': 'List of users'}
    }
})
def get_users():
    return jsonify([{'id': 1, 'name': 'John'}, {'id': 2, 'name': 'Jane'}])

if __name__ == '__main__':
    app.run(debug=True)

That's it! Now visit http://localhost:5000/docs to see your interactive API documentation! 🎊

📖 Usage

Basic Setup

from flask import Flask
from swagflask import SwaggerUI

app = Flask(__name__)
swagger = SwaggerUI(app)

Custom Configuration

swagger = SwaggerUI(
    app,
    title="My Awesome API",           # API title
    version="1.0.0",                   # API version
    description="API Description",     # API description
    docs_url="/docs",                  # Swagger UI URL (default: /docs)
    openapi_url="/openapi.json"        # OpenAPI spec URL (default: /openapi.json)
)

Documenting Endpoints

With the @swagger.doc() decorator:

@app.route('/users/<int:user_id>', methods=['GET'])
@swagger.doc({
    'summary': 'Get user by ID',
    'description': 'Returns a single user by their ID',
    'parameters': [{
        'name': 'user_id',
        'in': 'path',
        'required': True,
        'schema': {'type': 'integer'},
        'description': 'The ID of the user to retrieve'
    }],
    'responses': {
        '200': {
            'description': 'User found',
            'content': {
                'application/json': {
                    'schema': {
                        'type': 'object',
                        'properties': {
                            'id': {'type': 'integer'},
                            'name': {'type': 'string'},
                            'email': {'type': 'string'}
                        }
                    }
                }
            }
        },
        '404': {'description': 'User not found'}
    }
})
def get_user(user_id):
    # Your code here
    return jsonify({'id': user_id, 'name': 'John Doe'})

POST endpoints with request body and auto-filled examples:

@app.route('/users', methods=['POST'])
@swagger.doc({
    'summary': 'Create a new user',
    'requestBody': {
        'required': True,
        'content': {
            'application/json': {
                'schema': SwaggerUI.schema(
                    properties={
                        'name': {'type': 'string', 'example': 'John Doe'},
                        'email': {'type': 'string', 'format': 'email', 'example': 'john@example.com'},
                        'age': {'type': 'integer', 'example': 30}
                    },
                    required=['name', 'email'],
                    example={
                        'name': 'John Doe',
                        'email': 'john@example.com',
                        'age': 30
                    }
                )
            }
        }
    },
    'responses': {
        '201': {'description': 'User created successfully'},
        '400': {'description': 'Invalid input'}
    }
})
def create_user():
    data = request.get_json()
    # Your code here
    return jsonify(data), 201

The SwaggerUI.schema() helper makes it easy to define schemas with examples that auto-fill in Swagger UI, just like FastAPI!

Auto-documentation (without decorator):

SwagFlask can automatically generate basic documentation from your function signatures and docstrings:

@app.route('/products', methods=['GET'])
def get_products():
    """
    Get all products.
    This endpoint returns a list of all available products.
    """
    return jsonify([{'id': 1, 'name': 'Laptop'}])

📋 Examples

Check out the examples/ directory for complete working examples:

  • basic_app.py - Simple API with basic documentation
  • advanced_app.py - Advanced usage with custom configuration

To run the examples:

# Basic example
python examples/basic_app.py

# Advanced example
python examples/advanced_app.py

Then visit:

🎯 Why SwagFlask?

If you've used FastAPI, you know how amazing it is to have /docs built-in. But sometimes you need to use Flask for various reasons (existing codebase, specific requirements, etc.). SwagFlask brings that same documentation experience to Flask!

Comparison

FastAPI:

from fastapi import FastAPI
app = FastAPI()

@app.get("/users")
def get_users():
    return [{"id": 1, "name": "John"}]
# Visit /docs - it just works! ✨

Flask with SwagFlask:

from flask import Flask
from swagflask import SwaggerUI

app = Flask(__name__)
swagger = SwaggerUI(app)

@app.route('/users')
def get_users():
    return [{"id": 1, "name": "John"}]
# Visit /docs - it just works! ✨

🛠️ Development

Setup Development Environment

# Clone the repository
git clone https://github.com/rithwiksb/swagflask.git
cd swagflask

# Create virtual environment
python -m venv venv
source venv/bin/activate  # On Windows: venv\Scripts\activate

# Install in development mode
pip install -e .

# Install development dependencies
pip install -e ".[dev]"

Running Tests

pytest

🤝 Contributing

Contributions are welcome! Here are some ways you can contribute:

  • 🐛 Report bugs
  • 💡 Suggest new features
  • 📝 Improve documentation
  • 🔧 Submit pull requests

📄 License

This project is licensed under the MIT License - see the LICENSE file for details.

🙏 Acknowledgments

  • Inspired by FastAPI's excellent API documentation
  • Built with Flask
  • Uses Swagger UI for documentation interface

🔗 Links


Made with ❤️ for Flask developers who miss FastAPI's /docs

Project details


Download files

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

Source Distribution

swagflask-0.2.0.tar.gz (11.0 kB view details)

Uploaded Source

Built Distribution

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

swagflask-0.2.0-py3-none-any.whl (8.6 kB view details)

Uploaded Python 3

File details

Details for the file swagflask-0.2.0.tar.gz.

File metadata

  • Download URL: swagflask-0.2.0.tar.gz
  • Upload date:
  • Size: 11.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for swagflask-0.2.0.tar.gz
Algorithm Hash digest
SHA256 66f503330a86c134382d4ab594a9c56835aeaaecd429d89eb27031b0dca1ebec
MD5 a9caee18665286af4f3b434689d9d706
BLAKE2b-256 9bddc91bafaa7ad5f8ab98e341c02a18265ab20bc04eb5ee73f566cd307ad360

See more details on using hashes here.

File details

Details for the file swagflask-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: swagflask-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 8.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for swagflask-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6688bc74aa5986f227dde5737adda4a63d5d6405ab66bd895e1c1aca91a768fd
MD5 ade3262f7a5ab38508d89e0a662f10a5
BLAKE2b-256 a9a2a1f77436659384d21f91b1f32052824b6d473d07a9dd29e522db565de6d4

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