Skip to main content

OpenAPI (Swagger) integration for Python-based Azure Functions

Project description

azure-functions-openapi

PyPI Python Version CI Security Scans codecov pre-commit Docs License: MIT

Effortless OpenAPI (Swagger) documentation & Swagger‑UI for Python Azure Functions.


Features

Core Features

  • @openapi decorator — annotate once, generate full spec
  • Serves /openapi.json, /openapi.yaml, and /docs (Swagger UI)
  • Supports query/path/header parameters, requestBody, responses, tags
  • Optional Pydantic integration (supports both v1 and v2)
  • Zero hard dependency on Pydantic

Security

  • Enhanced Security: CSP headers, input validation, XSS protection
  • Input Sanitization: Automatic sanitization of routes, operation IDs, and parameters

Developer Experience

  • CLI Tool: Command-line interface for spec generation and validation
  • Comprehensive Testing: 85%+ test coverage with unit and integration suites
  • Documentation: Detailed guides for security, performance, and CLI usage
  • Type Safety: Full type hints and validation throughout

Quality Dashboard

Metric Target Source
Test coverage 85%+ target (latest CI: 87%) Codecov / make cov
Linting Clean Ruff
Type safety Clean Mypy
Security scan Clean Security Scans workflow (bandit + semgrep)

Installation

Supported Python versions: 3.10 - 3.14 (all versions are required in CI; 3.14 is stable)

pip install azure-functions-openapi

For local development:

git clone https://github.com/yeongseon/azure-functions-openapi.git
cd azure-functions-openapi
pip install -e .[dev]

Quick Start

Create a minimal HTTP-triggered Azure Function with auto Swagger documentation.

  1. Set up environment
python -m venv .venv
source .venv/bin/activate
pip install azure-functions azure-functions-worker azure-functions-openapi
  1. Initialize Azure Functions project
func init hello_openapi --python
cd hello_openapi
  1. Add function_app.py with OpenAPI-decorated function and endpoints:
# hello_openapi/function_app.py

import json
import azure.functions as func
from azure_functions_openapi.decorator import openapi
from azure_functions_openapi.openapi import get_openapi_json, get_openapi_yaml
from azure_functions_openapi.swagger_ui import render_swagger_ui

app = func.FunctionApp()

@openapi(
    summary="Greet user",
    route="/api/http_trigger",
    request_model={"name": "string"},
    response_model={"message": "string"},
    tags=["Example"]
)
@app.function_name(name="http_trigger")
@app.route(route="/api/http_trigger", auth_level=func.AuthLevel.ANONYMOUS, methods=["POST"])
def main(req: func.HttpRequest) -> func.HttpResponse:
    try:
        data = req.get_json()
        name = data.get("name", "world")
        return func.HttpResponse(
            json.dumps({"message": f"Hello, {name}!"}),
            mimetype="application/json"
        )
    except Exception as e:
        return func.HttpResponse(f"Error: {str(e)}", status_code=400)

@app.function_name(name="openapi_json")
@app.route(route="/api/openapi.json", auth_level=func.AuthLevel.ANONYMOUS, methods=["GET"])
def openapi_json(req: func.HttpRequest) -> func.HttpResponse:
    return get_openapi_json()

@app.function_name(name="openapi_yaml")
@app.route(route="/api/openapi.yaml", auth_level=func.AuthLevel.ANONYMOUS, methods=["GET"])
def openapi_yaml(req: func.HttpRequest) -> func.HttpResponse:
    return get_openapi_yaml()

@app.function_name(name="swagger_ui")
@app.route(route="/api/docs", auth_level=func.AuthLevel.ANONYMOUS, methods=["GET"])
def swagger_ui(req: func.HttpRequest) -> func.HttpResponse:
    return render_swagger_ui()

Swagger UI (/docs) is now supported via render_swagger_ui() helper.

  1. Run locally:
func start
  1. Deploy:
func azure functionapp publish <FUNCTION-APP-NAME> --python
  • OpenAPI JSON: https://.azurewebsites.net/api/openapi.json

A partial example of the generated /api/openapi.json:

{
  "openapi": "3.0.0",
  "info": {
    "title": "API",
    "version": "1.0.0",
    "description": "Auto-generated OpenAPI documentation. Markdown supported in descriptions (CommonMark)."
  },
  "paths": {
    "/api/http_trigger": {
      "get": {
        "summary": "HTTP Trigger with name parameter",
        "description": "Returns a greeting using the **name** from query or body.",
        "parameters": [
          {
            "name": "name",
            "in": "query",
            "required": true,
            "schema": { "type": "string" },
            "description": "Name to greet"
          }
        ],
        "responses": {
          "200": {
            "description": "Successful response with greeting",
            "content": {
              "application/json": {
                "examples": {
                  "sample": {
                    "summary": "Example greeting",
                    "value": {
                      "message": "Hello, Azure!"
                    }
                  }
                }
              }
            }
          },
          "400": { "description": "Invalid request" }
        }
      }
    }
  }
}
  • Swagger UI: https://.azurewebsites.net/api/docs

Swagger UI will look once you set up the routes:

Swagger UI Example


Example with Pydantic

from pydantic import BaseModel
from azure_functions_openapi.decorator import openapi

class RequestModel(BaseModel):
    name: str

class ResponseModel(BaseModel):
    message: str

@openapi(
    summary="Greet user (Pydantic)",
    route="/api/http_trigger",
    request_model=RequestModel,
    response_model=ResponseModel,
    tags=["Example"]
)
def http_trigger(req: func.HttpRequest) -> func.HttpResponse:
    ...

Supports both Pydantic v1 and v2. Schema inference will work automatically with either version.


CLI Tool

The package includes a powerful CLI tool for various operations:

# Generate OpenAPI specification
azure-functions-openapi generate --title "My API" --version "1.0.0"

# Generate OpenAPI spec
azure-functions-openapi generate --output openapi.json --format json

# Validate OpenAPI specification (external validator)
openapi-spec-validator openapi.json

See CLI Guide for complete documentation.

Documentation


License

MIT © 2025 Yeongseon Choe

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

azure_functions_openapi-0.10.1.tar.gz (176.6 kB view details)

Uploaded Source

Built Distribution

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

azure_functions_openapi-0.10.1-py3-none-any.whl (16.8 kB view details)

Uploaded Python 3

File details

Details for the file azure_functions_openapi-0.10.1.tar.gz.

File metadata

  • Download URL: azure_functions_openapi-0.10.1.tar.gz
  • Upload date:
  • Size: 176.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.12

File hashes

Hashes for azure_functions_openapi-0.10.1.tar.gz
Algorithm Hash digest
SHA256 1c0b8c6e808f47c04544918454f9859d8d83a51805789ab27d42c5581ce3ed53
MD5 0e0bb7542daaea0d5267cbe480b621a0
BLAKE2b-256 5202d1355b78e65523ad727e620fa1358fd8949cd1879bc948256bcec45926a2

See more details on using hashes here.

File details

Details for the file azure_functions_openapi-0.10.1-py3-none-any.whl.

File metadata

File hashes

Hashes for azure_functions_openapi-0.10.1-py3-none-any.whl
Algorithm Hash digest
SHA256 39c03e0246612874200c427f1e9a8b427e96c8b0c2be9356e958615337a93e26
MD5 5872c0b0a6269485f2f1c45118ffc8ab
BLAKE2b-256 aa75f904e1403c57eee9d8b51e6c9838cb6f550b6f6ae69011ca202283083365

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