OpenAPI (Swagger) integration for Python-based Azure Functions
Project description
azure-functions-openapi
Effortless OpenAPI (Swagger) documentation & Swagger‑UI for Python Azure Functions.
Features
Core Features
@openapidecorator — 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 & Performance
- Enhanced Security: CSP headers, input validation, XSS protection
- Performance Caching: In-memory caching with TTL and LRU eviction
- Error Handling: Standardized error responses with detailed logging
- Input Sanitization: Automatic sanitization of routes, operation IDs, and parameters
Monitoring & Operations
- Health Checks: Built-in health monitoring for all components
- Performance Metrics: Response time tracking, throughput monitoring
- Request Logging: Detailed request/response logging with statistics
- Server Information: Comprehensive server info and runtime details
Developer Experience
- CLI Tool: Command-line interface for spec generation, validation, and monitoring
- Comprehensive Testing: 97% test coverage with extensive test suites
- Documentation: Detailed guides for security, performance, and CLI usage
- Type Safety: Full type hints and validation throughout
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.
- Set up environment
python -m venv .venv
source .venv/bin/activate
pip install azure-functions azure-functions-worker azure-functions-openapi
- Initialize Azure Functions project
func init hello_openapi --python
cd hello_openapi
- Add
function_app.pywith 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 viarender_swagger_ui()helper.
- Run locally:
func start
- OpenAPI JSON: http://localhost:7071/api/openapi.json
- Swagger UI: http://localhost:7071/api/docs
- 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:
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"
# Get server information
azure-functions-openapi info
# Check health status
azure-functions-openapi health
# Get performance metrics
azure-functions-openapi metrics
# Validate OpenAPI specification
azure-functions-openapi validate openapi.json
See CLI Guide for complete documentation.
Documentation
- Full docs: yeongseon.github.io/azure-functions-openapi
- Quickstart
- Development Guide
- Contribution Guide
- Security Guide
- Performance Guide
- CLI Guide
License
MIT © 2025 Yeongseon Choe
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
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file azure_functions_openapi-0.8.0.tar.gz.
File metadata
- Download URL: azure_functions_openapi-0.8.0.tar.gz
- Upload date:
- Size: 189.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a82b96238ffb42f2e2c21192ebc8ba08b2d28dc8cf3e6778eac13d6d82419818
|
|
| MD5 |
bf60fc103a78dd06011b3a105e0053c2
|
|
| BLAKE2b-256 |
f2dc0b51942795fac955d4c65cc87a52e28217337a755fcde9520e34e4c214a4
|
File details
Details for the file azure_functions_openapi-0.8.0-py3-none-any.whl.
File metadata
- Download URL: azure_functions_openapi-0.8.0-py3-none-any.whl
- Upload date:
- Size: 26.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be6c5ae3ad257d0192f1ffbe3bb03ce2b88c262fe63b3f34a942f0d92f5703e7
|
|
| MD5 |
584a7eb7ce5fb6517c1b9cef13f68c78
|
|
| BLAKE2b-256 |
b1342a20f2ad1226a2f98853b8e6db7707962eb2175890131755bb9e53af3b11
|