Routers API Reference¶
API reference for router classes in FastOpenAPI.
Router Classes¶
FastOpenAPI provides router classes for each supported framework:
AioHttpRouter- for aiohttp (async)DjangoRouter- for Django (sync)DjangoAsyncRouter- for Django (async)FalconRouter- for Falcon (sync)FalconAsyncRouter- for Falcon (async)FlaskRouter- for Flask (sync)QuartRouter- for Quart (async)SanicRouter- for Sanic (async)StarletteRouter- for Starlette (async)TornadoRouter- for Tornado (async/sync)
BaseRouter¶
All framework routers inherit from BaseRouter.
Constructor¶
def __init__(
self,
app: Any = None,
docs_url: str | None = "/docs",
redoc_url: str | None = "/redoc",
openapi_url: str | None = "/openapi.json",
openapi_version: str = "3.0.0",
title: str = "My App",
version: str = "0.1.0",
description: str = "API documentation",
security_scheme: SecuritySchemeType | None = SecuritySchemeType.BEARER_JWT,
)
Parameters¶
- app: Framework application instance
- docs_url: URL for Swagger UI docs (default:
"/docs") - redoc_url: URL for ReDoc UI docs (default:
"/redoc") - openapi_url: URL for OpenAPI JSON schema (default:
"/openapi.json")
Note: Setting any of these to
Nonedisables all documentation endpoints (Swagger UI, ReDoc, and OpenAPI JSON) at once. - openapi_version: OpenAPI specification version (default:"3.0.0") - title: API title - version: API version - description: API description - security_scheme: Security scheme for OpenAPI docs (default: Bearer JWT)
HTTP Method Decorators¶
get()¶
Register GET endpoint.
Parameters:
- path: URL path (e.g., /users/{user_id})
- **meta: Optional metadata
- response_model: Pydantic model for response validation
- status_code: HTTP status code (default: 200)
- tags: List of tags for OpenAPI grouping
- summary: Short summary for OpenAPI docs
- description: Detailed description for OpenAPI docs
- deprecated: Mark as deprecated (default: False)
Example:
@router.get(
"/users/{user_id}",
response_model=User,
tags=["Users"],
summary="Get user by ID",
description="Retrieve a single user by their ID"
)
def get_user(user_id: int):
return {"id": user_id, "username": "john"}
post()¶
Register POST endpoint (typically for creating resources).
Example:
@router.post(
"/users",
response_model=User,
status_code=201,
tags=["Users"]
)
def create_user(user: UserCreate):
return create_user_in_db(user)
put()¶
Register PUT endpoint (typically for full updates).
Example:
@router.put("/users/{user_id}", response_model=User)
def update_user(user_id: int, user: UserUpdate):
return update_user_in_db(user_id, user)
patch()¶
Register PATCH endpoint (typically for partial updates).
Example:
@router.patch("/users/{user_id}", response_model=User)
def partial_update_user(user_id: int, updates: UserPartialUpdate):
return patch_user_in_db(user_id, updates)
delete()¶
Register DELETE endpoint.
Example:
@router.delete("/users/{user_id}", status_code=204)
def delete_user(user_id: int):
delete_user_from_db(user_id)
return None
head()¶
Register HEAD endpoint.
options()¶
Register OPTIONS endpoint.
Router Properties¶
openapi¶
Get the OpenAPI schema (lazy-loaded).
Returns the complete OpenAPI 3.0 schema as a dictionary.
Example:
from flask import Flask
from fastopenapi.routers import FlaskRouter
app = Flask(__name__)
router = FlaskRouter(app=app, title="My API", version="1.0.0")
@router.get("/items")
def list_items():
return {"items": []}
# Get OpenAPI schema
schema = router.openapi
print(schema["info"]["title"]) # "My API"
print(schema["info"]["version"]) # "1.0.0"
Router Methods¶
add_route()¶
Manually add a route to the router.
Parameters:
- path: URL path
- method: HTTP method ("GET", "POST", etc.)
- endpoint: Handler function
Example:
Note: Typically you use decorators instead of calling this directly.
include_router()¶
Include routes from another router with an optional prefix.
Parameters:
- other: Router to include
- prefix: URL prefix for all routes from the other router
Example:
from fastopenapi.routers import FlaskRouter
# Main router
main_router = FlaskRouter(app=app)
# Sub-router for users
users_router = FlaskRouter()
@users_router.get("/{user_id}")
def get_user(user_id: int):
return {"user_id": user_id}
@users_router.post("/")
def create_user(username: str):
return {"username": username}
# Include users router with prefix
main_router.include_router(users_router, prefix="/users")
# Now available at:
# GET /users/{user_id}
# POST /users/
get_routes()¶
Get all registered routes.
Returns: List of RouteInfo objects containing route metadata.
Example:
Framework-Specific Routers¶
FlaskRouter¶
from flask import Flask
from fastopenapi.routers import FlaskRouter
app = Flask(__name__)
router = FlaskRouter(
app=app,
title="Flask API",
version="1.0.0"
)
@router.get("/items")
def list_items():
return {"items": []}
if __name__ == "__main__":
app.run()
StarletteRouter¶
import uvicorn
from starlette.applications import Starlette
from fastopenapi.routers import StarletteRouter
app = Starlette()
router = StarletteRouter(
app=app,
title="Starlette API",
version="1.0.0"
)
@router.get("/items")
async def list_items():
return {"items": []}
if __name__ == "__main__":
uvicorn.run(app)
AioHttpRouter¶
from aiohttp import web
from fastopenapi.routers import AioHttpRouter
app = web.Application()
router = AioHttpRouter(
app=app,
title="AioHTTP API",
version="1.0.0"
)
@router.get("/items")
async def list_items():
return {"items": []}
if __name__ == "__main__":
web.run_app(app)
SanicRouter¶
from sanic import Sanic
from fastopenapi.routers import SanicRouter
app = Sanic("MyApp")
router = SanicRouter(
app=app,
title="Sanic API",
version="1.0.0"
)
@router.get("/items")
async def list_items():
return {"items": []}
if __name__ == "__main__":
app.run()
QuartRouter¶
from quart import Quart
from fastopenapi.routers import QuartRouter
app = Quart(__name__)
router = QuartRouter(
app=app,
title="Quart API",
version="1.0.0"
)
@router.get("/items")
async def list_items():
return {"items": []}
if __name__ == "__main__":
app.run()
FalconRouter / FalconAsyncRouter¶
from falcon import App
from fastopenapi.routers import FalconRouter
app = App()
router = FalconRouter(
app=app,
title="Falcon API",
version="1.0.0"
)
@router.get("/items")
def list_items():
return {"items": []}
# For async Falcon:
# from fastopenapi.routers import FalconAsyncRouter
# router = FalconAsyncRouter(app=app)
DjangoRouter / DjangoAsyncRouter¶
Django doesn't have a typical application object like other frameworks. Pass app=True to enable documentation endpoint registration (this satisfies the internal app is not None check):
from django.urls import path
from fastopenapi.routers import DjangoRouter
router = DjangoRouter(app=True)
@router.get("/items")
def list_items():
return {"items": []}
urlpatterns = [path("", router.urls)]
# For async Django:
# from fastopenapi.routers import DjangoAsyncRouter
# router = DjangoAsyncRouter(app=True)
TornadoRouter¶
import asyncio
from tornado.web import Application
from fastopenapi.routers import TornadoRouter
app = Application()
router = TornadoRouter(
app=app,
title="Tornado API",
version="1.0.0"
)
@router.get("/items")
async def list_items():
return {"items": []}
async def main():
app.listen(8000)
await asyncio.Event().wait()
if __name__ == "__main__":
asyncio.run(main())
Security Schemes¶
Set the security scheme for OpenAPI documentation:
from fastopenapi import SecuritySchemeType
# Bearer JWT (default)
router = FlaskRouter(
app=app,
security_scheme=SecuritySchemeType.BEARER_JWT
)
# API Key in header
router = FlaskRouter(
app=app,
security_scheme=SecuritySchemeType.API_KEY_HEADER
)
# API Key in query
router = FlaskRouter(
app=app,
security_scheme=SecuritySchemeType.API_KEY_QUERY
)
# Basic Auth
router = FlaskRouter(
app=app,
security_scheme=SecuritySchemeType.BASIC_AUTH
)
# OAuth2
router = FlaskRouter(
app=app,
security_scheme=SecuritySchemeType.OAUTH2
)
# No security scheme
router = FlaskRouter(
app=app,
security_scheme=None
)
Documentation URLs¶
Customizing Documentation URLs¶
router = FlaskRouter(
app=app,
docs_url="/api/docs", # Swagger UI
redoc_url="/api/redoc", # ReDoc
openapi_url="/api/openapi.json" # OpenAPI schema
)
Disabling Documentation¶
To disable all documentation endpoints, set any URL to None:
Route Metadata¶
Tags¶
Group endpoints in documentation:
@router.get("/users", tags=["Users"])
def list_users():
return []
@router.get("/posts", tags=["Posts"])
def list_posts():
return []
Summary and Description¶
@router.get(
"/users/{user_id}",
summary="Get user by ID",
description="Retrieve detailed information about a specific user",
tags=["Users"]
)
def get_user(user_id: int):
return {"id": user_id}
Deprecated¶
@router.get(
"/old-endpoint",
deprecated=True,
description="This endpoint is deprecated. Use /new-endpoint instead."
)
def old_endpoint():
return {"message": "Deprecated"}
Best Practices¶
1. Use App Instance¶
# Good - pass app to router
app = Flask(__name__)
router = FlaskRouter(app=app)
# Avoid - creating router without app
router = FlaskRouter()
2. Organize with Tags¶
@router.get("/users", tags=["Users"])
@router.get("/posts", tags=["Posts"])
@router.get("/comments", tags=["Comments"])
3. Use Sub-Routers¶
# users_router.py
users_router = FlaskRouter()
@users_router.get("/{user_id}")
def get_user(user_id: int):
return {"id": user_id}
# main.py
from users_router import users_router
main_router = FlaskRouter(app=app)
main_router.include_router(users_router, prefix="/users")
4. Set Appropriate Metadata¶
router = FlaskRouter(
app=app,
title="My Production API",
version="2.1.0",
description="Comprehensive API for managing resources"
)
See Also¶
- Routing Guide - Routing patterns
- Framework Guides - Framework-specific guides
- OpenAPI Customization - Customizing OpenAPI docs
- Security Guide - Security configuration