microdot.cors — Cross-Origin Resource Sharing

Aggiunge gli header di cui un browser ha bisogno per consentire a JavaScript in esecuzione su un’origine di chiamare i tuoi endpoint ospitati dalla camera su un’origine diversa. La classe si collega all’handler OPTIONS dell’applicazione (per le richieste preflight) e all’hook after-request (per gli header Access-Control-* sulle risposte normali).

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

L’istanza microdot.Microdot a cui collegarsi. Può essere None per posticipare il collegamento; chiama initialize() in seguito.

allowed_origins

Un elenco di stringhe di origine (["https://app.example.com"]) oppure il valore letterale '*' per consentire qualsiasi origine. Le origini che non corrispondono a questo elenco non ricevono header CORS, cosa che il browser interpreta come «questa richiesta non è consentita».

allow_credentials

Se True, aggiunge Access-Control-Allow-Credentials: true in modo che il browser invii cookie e header di autenticazione con le richieste cross-origin. Non può essere utilizzato con allowed_origins='*' per nessuna richiesta che necessiti di credenziali (i browser rifiutano tale combinazione).

allowed_methods

Elenco di metodi (['GET', 'POST']) che il browser può utilizzare cross-origin. None significa qualsiasi.

expose_headers

Elenco di nomi di header di risposta che il browser può esporre a JavaScript.

allowed_headers

Elenco di nomi di header di richiesta che i client possono includere cross-origin. None significa qualsiasi (restituisce l”Access-Control-Request-Headers della richiesta preflight).

max_age

Secondi durante i quali il browser può memorizzare nella cache il risultato del preflight. Ometterlo significa che il browser riconvalida ogni preflight.

handle_cors

Se False, la classe è configurata ma non si collega effettivamente – utile quando si desidera combinare manualmente l’output di get_cors_headers() con altro middleware.

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

Si collega a app se la costruzione è stata posticipata.

get_cors_headers(request) dict

Calcola l’insieme di header Access-Control-* applicabili a request. Utilizzato internamente dall’hook after-request; le applicazioni possono chiamarlo direttamente quando emettono header CORS da middleware personalizzato.

allowed_origins: list | str | None

L’elenco configurato di origini, oppure il valore letterale '*'. Rispecchia l’argomento del costruttore allowed_origins; riassegnalo a runtime per modificare la policy senza ricostruire l’oggetto.

allow_credentials: bool

Indica se Access-Control-Allow-Credentials: true viene emesso sulle richieste corrispondenti. Rispecchia l’argomento del costruttore allow_credentials.

allowed_methods: list | None

Elenco di nomi di metodi consentiti cross-origin, oppure None per «qualsiasi». Rispecchia l’argomento del costruttore allowed_methods.

expose_headers: list | None

Elenco di header di risposta che il browser può esporre a JavaScript, oppure None per omettere l’header Access-Control-Expose-Headers. Rispecchia l’argomento del costruttore expose_headers.

allowed_headers: list | None

Elenco di nomi di header di richiesta accettati cross-origin, in minuscolo, oppure None per «restituire qualsiasi cosa abbia richiesto il preflight». Rispecchia l’argomento del costruttore allowed_headers (il costruttore converte l’elenco in minuscolo prima di memorizzarlo).

max_age: int | None

Secondi durante i quali il browser può memorizzare nella cache la risposta preflight, oppure None per omettere l’header Access-Control-Max-Age. Rispecchia l’argomento del costruttore max_age.

Esempio:

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 richiesta preflight OPTIONS viene gestita automaticamente; la camera restituisce gli header Access-Control-* appropriati e 204 No Content. Le risposte effettive GET / POST / ecc. ricevono l’header Access-Control-Allow-Origin tramite l’hook after-request registrato.