{"library":"sanic-cors","title":"Sanic-CORS","description":"Sanic-CORS is a Sanic extension that provides Cross-Origin Resource Sharing (CORS) support, primarily through a decorator. It is based on the popular Flask-CORS library. The current version is 2.2.0, with a release cadence that aligns with critical Sanic updates and bug fixes, typically every few months for major Sanic version compatibility.","language":"python","status":"active","last_verified":"Mon May 18","install":{"commands":["pip install sanic-cors"],"cli":null},"imports":["from sanic_cors import CORS","from sanic_cors import cross_origin"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"from sanic import Sanic, response\nfrom sanic_cors import CORS, cross_origin\nimport os\n\napp = Sanic(__name__)\n\n# Enable CORS for the entire application (or specify options)\nCORS(app, origins=\"*\", allow_headers=\"*\", expose_headers=\"*\", automatic_options=True)\n\n@app.route(\"/\", methods=[\"GET\"])\n@cross_origin(origins=os.environ.get('ALLOWED_ORIGIN', '*')) # Decorator for specific route\nasync def hello_world(request):\n    return response.json({\"message\": \"Hello from Sanic-CORS!\"})\n\n@app.route(\"/data\", methods=[\"GET\", \"POST\"])\n# cross_origin() can be omitted if CORS(app) handles it globally\nasync def get_data(request):\n    if request.method == \"GET\":\n        return response.json({\"data\": \"Some public data\"})\n    elif request.method == \"POST\":\n        return response.json({\"status\": \"Data received\"})\n\nif __name__ == \"__main__\":\n    app.run(host=\"0.0.0.0\", port=8000)","lang":"python","description":"This quickstart demonstrates how to enable CORS globally for a Sanic application using `CORS(app)` and how to apply it to individual routes using the `@cross_origin()` decorator. It sets up a basic Sanic app with two routes and ensures CORS headers are correctly handled for preflight OPTIONS requests and actual data requests.","tag":null,"tag_description":null,"last_tested":null,"results":[]},"compatibility":{"tag":null,"tag_description":null,"last_tested":"2026-05-18","installed_version":"2.2.0","pypi_latest":"2.2.0","is_stale":false,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":3.4,"avg_import_s":0.62,"wheel_type":"wheel"},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"sanic-cors","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.51,"mem_mb":13.6,"disk_size":"38.7M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"sanic-cors","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.4,"import_time_s":0.4,"mem_mb":13.6,"disk_size":"39M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"sanic-cors","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.66,"mem_mb":15.2,"disk_size":"41.9M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"sanic-cors","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.2,"import_time_s":0.59,"mem_mb":15.2,"disk_size":"43M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"sanic-cors","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.83,"mem_mb":15.4,"disk_size":"44.6M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"sanic-cors","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.3,"import_time_s":0.82,"mem_mb":15.4,"disk_size":"46M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"sanic-cors","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.79,"mem_mb":15.9,"disk_size":"44.1M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"sanic-cors","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.4,"import_time_s":0.73,"mem_mb":15.9,"disk_size":"46M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"sanic-cors","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":null,"import_time_s":0.47,"mem_mb":13.3,"disk_size":"38.0M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"sanic-cors","exit_code":0,"wheel_type":"wheel","failure_reason":null,"import_side_effects":"clean","install_time_s":3.9,"import_time_s":0.42,"mem_mb":13.3,"disk_size":"39M"}]}}