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.11.0.tar.gz (176.3 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.11.0-py3-none-any.whl (16.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: azure_functions_openapi-0.11.0.tar.gz
  • Upload date:
  • Size: 176.3 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.11.0.tar.gz
Algorithm Hash digest
SHA256 6869a8695d88cd9de5cb6322a674047d6d548f61931bd58028234452f006e5e1
MD5 a6003f715fa69ffaa52cbce480d18098
BLAKE2b-256 56d0e506f4ec3c4f01f03a2820248835a9d68fafa28aaf29ce91cae2e093f65c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for azure_functions_openapi-0.11.0-py3-none-any.whl
Algorithm Hash digest
SHA256 28cf44dbea5605f785354ed80e80e5bb8af49f93c57b0531b7ed7d0191dd20e0
MD5 fd621a27d82f23ae947261e1059ca6a9
BLAKE2b-256 4bb3bcf3613efec162d5525e0ece7b8dba8c188e1f5c3081d3faa731f3cbaeae

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