Skip to main content

OpenAPI (Swagger) integration for Python-based Azure Functions

Project description

azure-functions-openapi

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

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


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

Installation

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.


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.4.0.tar.gz (137.7 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.4.0-py3-none-any.whl (8.6 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: azure_functions_openapi-0.4.0.tar.gz
  • Upload date:
  • Size: 137.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.22

File hashes

Hashes for azure_functions_openapi-0.4.0.tar.gz
Algorithm Hash digest
SHA256 669d0ea6261f6ce58933ca10658da736a0c39a69c453de370034d4dd2e1795cb
MD5 4bf7ce5609c7269580e23702b0f53e3e
BLAKE2b-256 4ed84e82b6c2d1b5fbcbb87930c22cad90499d12f56a942a501d326c3e4db39d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for azure_functions_openapi-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9517f782440f090fab4317f57ef83d7fdd06928c580545c7b369931563f09ea6
MD5 1a7f766f16ddeea09336df2e9c4c3422
BLAKE2b-256 ae4f485f3494381798c68673941deff2062e89d267a3fd11483cc9feabc1a99a

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