Connexion Cookbook¶
This page provides recipes with Connexion as an ingredient.
CORS¶
You can enable CORS (Cross-origin resource sharing) by leveraging the CORSMiddleware offered by
Starlette. You can add it to your application, ideally in front of the RoutingMiddleware
.
from pathlib import Path
from connexion import AsyncApp
from connexion.middleware import MiddlewarePosition
from starlette.middleware.cors import CORSMiddleware
app = AsyncApp(__name__)
app.add_middleware(
CORSMiddleware,
position=MiddlewarePosition.BEFORE_EXCEPTION,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.add_api("openapi.yaml")
if __name__ == "__main__":
app.run(f"{Path(__file__).stem}:app", port=8080)
View a detailed reference of the add_middleware
method
- AsyncApp.add_middleware(middleware_class: Type[Callable[[MutableMapping[str, Any], Callable[[], Awaitable[MutableMapping[str, Any]]], Callable[[MutableMapping[str, Any]], Awaitable[None]]], Awaitable[None]]], position: MiddlewarePosition = MiddlewarePosition.BEFORE_CONTEXT, **options: Any) None
Add a middleware to the stack on the specified position.
- Parameters:
middleware_class – Middleware class to add
position – Position to add the middleware, one of the MiddlewarePosition Enum
options – Options to pass to the middleware_class on initialization
from pathlib import Path
from connexion import FlaskApp
from connexion.middleware import MiddlewarePosition
from starlette.middleware.cors import CORSMiddleware
app = FlaskApp(__name__)
app.add_middleware(
CORSMiddleware,
position=MiddlewarePosition.BEFORE_EXCEPTION,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.add_api("openapi.yaml")
if __name__ == "__main__":
app.run(f"{Path(__file__).stem}:app", port=8080)
View a detailed reference of the add_middleware
method
- FlaskApp.add_middleware(middleware_class: Type[Callable[[MutableMapping[str, Any], Callable[[], Awaitable[MutableMapping[str, Any]]], Callable[[MutableMapping[str, Any]], Awaitable[None]]], Awaitable[None]]], position: MiddlewarePosition = MiddlewarePosition.BEFORE_CONTEXT, **options: Any) None
Add a middleware to the stack on the specified position.
- Parameters:
middleware_class – Middleware class to add
position – Position to add the middleware, one of the MiddlewarePosition Enum
options – Options to pass to the middleware_class on initialization
from pathlib import Path
from asgi_framework import App
from connexion import ConnexionMiddleware
from starlette.middleware.cors import CORSMiddleware
app = App(__name__)
app = ConnexionMiddleware(app)
app.add_middleware(
CORSMiddleware,
position=MiddlewarePosition.BEFORE_EXCEPTION,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
app.add_api("openapi.yaml")
if __name__ == "__main__":
app.run(f"{Path(__file__).stem}:app", port=8080)
View a detailed reference of the add_middleware
method
- ConnexionMiddleware.add_middleware(middleware_class: Type[Callable[[MutableMapping[str, Any], Callable[[], Awaitable[MutableMapping[str, Any]]], Callable[[MutableMapping[str, Any]], Awaitable[None]]], Awaitable[None]]], *, position: MiddlewarePosition = MiddlewarePosition.BEFORE_CONTEXT, **options: Any) None
Add a middleware to the stack on the specified position.
- Parameters:
middleware_class – Middleware class to add
position – Position to add the middleware, one of the MiddlewarePosition Enum
options – Options to pass to the middleware_class on initialization
Reverse Proxy¶
When running behind a reverse proxy with stripped path prefix, you need to configure your application to properly handle this.
Single known path prefix¶
If there is only a single known prefix your application will be running behind, you can simply pass this path prefix as the root_path to your ASGI server:
$ uvicorn run:app --root-path <root_path>
$ gunicorn -k uvicorn.workers.UvicornWorker run:app --root-path <root_path>
Dynamic path prefix¶
If you are running behind multiple proxies, or the path is not known, you can wrap your application in a ReverseProxied middleware as shown in this example.