microdot.cors — Intercambio de recursos de origen cruzado

Agrega los encabezados que un navegador necesita para permitir que el JavaScript que se ejecuta en un origen llame a sus endpoints alojados en la cámara en un origen diferente. La clase se integra en el controlador OPTIONS de la aplicación (para las solicitudes de comprobación previa) y en el gancho posterior a la solicitud (para los encabezados Access-Control-* en las respuestas normales).

class CORS

class microdot.cors.CORS(app: Microdot | None = None, allowed_origins=None, allow_credentials: bool = False, allowed_methods: list | None = None, expose_headers: list | None = None, allowed_headers: list | None = None, max_age: int | None = None, handle_cors: bool = True)
app

La instancia de microdot.Microdot a la que adjuntarse. Puede ser None para diferir la conexión; llame a initialize() más tarde.

allowed_origins

Una lista de cadenas de origen (["https://app.example.com"]) o el literal '*' para permitir cualquier origen. Los orígenes que no coinciden con esta lista no obtienen encabezados CORS, lo que el navegador interpreta como «esta solicitud no está permitida».

allow_credentials

Si es True, agrega Access-Control-Allow-Credentials: true para que el navegador envíe cookies y encabezados de autenticación con las solicitudes de origen cruzado. No puede usarse con allowed_origins='*' para ninguna solicitud que necesite credenciales (los navegadores rechazan esa combinación).

allowed_methods

Lista de métodos (['GET', 'POST']) que el navegador puede usar en origen cruzado. None significa cualquiera.

expose_headers

Lista de nombres de encabezados de respuesta que el navegador puede exponer a JavaScript.

allowed_headers

Lista de nombres de encabezados de solicitud que los clientes pueden incluir en origen cruzado. None significa cualquiera (refleja el Access-Control-Request-Headers de la comprobación previa).

max_age

Segundos durante los cuales el navegador puede almacenar en caché el resultado de la comprobación previa. Omitirlo significa que el navegador revalida cada comprobación previa.

handle_cors

Si es False, la clase se configura pero no se adjunta realmente: útil cuando se desea combinar manualmente su salida de get_cors_headers() con otro middleware.

initialize(app: Microdot, handle_cors: bool = True)

Se adjunta a app si la construcción se difirió.

get_cors_headers(request) dict

Calcula el conjunto de encabezados Access-Control-* que se aplican a request. Lo utiliza internamente el gancho posterior a la solicitud; las aplicaciones pueden llamarlo directamente al emitir encabezados CORS desde middleware personalizado.

allowed_origins: list | str | None

La lista configurada de orígenes, o el literal '*'. Refleja el argumento del constructor allowed_origins; reasígnelo en tiempo de ejecución para cambiar la política sin reconstruir el objeto.

allow_credentials: bool

Si se emite Access-Control-Allow-Credentials: true en las solicitudes coincidentes. Refleja el argumento del constructor allow_credentials.

allowed_methods: list | None

Lista de nombres de métodos permitidos en origen cruzado, o None para «cualquiera». Refleja el argumento del constructor allowed_methods.

expose_headers: list | None

Lista de encabezados de respuesta que el navegador puede exponer a JavaScript, o None para omitir el encabezado Access-Control-Expose-Headers. Refleja el argumento del constructor expose_headers.

allowed_headers: list | None

Lista de nombres de encabezados de solicitud aceptados en origen cruzado, en minúsculas, o None para «reflejar lo que la comprobación previa haya solicitado». Refleja el argumento del constructor allowed_headers (el constructor convierte la lista a minúsculas antes de almacenarla).

max_age: int | None

Segundos durante los cuales el navegador puede almacenar en caché la respuesta de comprobación previa, o None para omitir el encabezado Access-Control-Max-Age. Refleja el argumento del constructor max_age.

Ejemplo:

from microdot import Microdot
from microdot.cors import CORS

app = Microdot()
CORS(app,
     allowed_origins=['https://dashboard.example.com'],
     allow_credentials=True,
     max_age=86400)

@app.get('/api/status')
async def status(request):
    return {'ok': True}

La solicitud de comprobación previa OPTIONS se gestiona automáticamente; la cámara devuelve los encabezados Access-Control-* apropiados y 204 No Content. Las respuestas reales GET / POST / etc. obtienen el encabezado Access-Control-Allow-Origin mediante el gancho posterior a la solicitud registrado.