{"library":"oslo-middleware","title":"Oslo Middleware Library","description":"Oslo.middleware is an OpenStack library that provides a collection of WSGI middleware components for web service development. It allows developers to inject functionality into WSGI pipelines to intercept and modify request/response flows, offering features like HTTP header manipulation, request body size limiting, CORS support, and error handling. It is an actively maintained project within the OpenStack ecosystem, with regular releases aligning with OpenStack development cycles.","language":"python","status":"active","last_verified":"Sun May 17","install":{"commands":["pip install oslo-middleware"],"cli":null},"imports":["from oslo_middleware import cors","from oslo_middleware import catch_errors","from oslo_middleware import request_id"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import webob.dec\nimport webob.exc\nfrom oslo_middleware import catch_errors\nfrom oslo_middleware import request_id\n\n@webob.dec.wsgify\ndef simple_app(req):\n    if req.path_info == '/hello':\n        return f\"Hello, Request ID: {req.environ.get('openstack.request_id', 'N/A')}\"\n    elif req.path_info == '/error':\n        raise ValueError('Something went wrong!')\n    return webob.exc.HTTPNotFound()\n\n# Order matters: RequestId first to ensure ID is generated,\n# then CatchErrors to handle subsequent exceptions.\napp = request_id.RequestId(simple_app)\napp = catch_errors.CatchErrors(app)\n\n# To run this with a WSGI server (e.g., Gunicorn or uWSGI):\n# Save as app.py and run 'gunicorn app:app'\n# Test with curl:\n# curl http://127.0.0.1:8000/hello\n# curl http://127.0.0.1:8000/error\n","lang":"python","description":"This example demonstrates how to chain two `oslo_middleware` components, `RequestId` and `CatchErrors`, with a basic WSGI application. `RequestId` ensures a unique ID for each request, and `CatchErrors` provides high-level error handling, preventing raw tracebacks from being exposed to clients. This setup is typical in OpenStack services.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-17","installed_version":"6.6.0","pypi_latest":"8.0.0","is_stale":true,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":4.9,"avg_import_s":0.7,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"oslo-middleware","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.63,"mem_mb":12.7,"disk_size":"45.2M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"oslo-middleware","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4.7,"import_time_s":0.45,"mem_mb":12.7,"disk_size":"46M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"oslo-middleware","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":0.95,"mem_mb":14.1,"disk_size":"49.8M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"oslo-middleware","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":4.7,"import_time_s":0.86,"mem_mb":14.1,"disk_size":"51M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"oslo-middleware","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":null,"import_time_s":0.74,"mem_mb":13.6,"disk_size":"50.0M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"oslo-middleware","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"noisy","install_time_s":4.7,"import_time_s":0.86,"mem_mb":13.6,"disk_size":"51M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"oslo-middleware","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.71,"mem_mb":14.4,"disk_size":"49.9M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"oslo-middleware","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":4.7,"import_time_s":0.8,"mem_mb":14.4,"disk_size":"51M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"oslo-middleware","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.5,"mem_mb":12.8,"disk_size":"47.2M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"oslo-middleware","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":5.6,"import_time_s":0.55,"mem_mb":12.8,"disk_size":"48M"}]}}