microdot.cors — Cross-Origin Resource Sharing

Adaugă antetele de care un browser are nevoie pentru a permite codului JavaScript care rulează pe o origine să apeleze endpoint-urile găzduite pe cameră de pe o altă origine. Clasa se integrează în handlerul OPTIONS al aplicației (pentru cererile preflight) și în hook-ul de după cerere (pentru antetele Access-Control-* din răspunsurile normale).

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

Instanța microdot.Microdot la care se atașează. Poate fi None pentru a amâna atașarea; apelează initialize() mai târziu.

allowed_origins

O listă de șiruri de origini (["https://app.example.com"]) sau literalul '*' pentru a permite orice origine. Originile care nu corespund acestei liste nu primesc antete CORS, ceea ce browserul interpretează drept „această cerere nu este permisă”.

allow_credentials

Dacă este True, adaugă Access-Control-Allow-Credentials: true astfel încât browserul să trimită cookie-uri și antete de autentificare cu cererile cross-origin. Nu poate fi folosit cu allowed_origins='*' pentru nicio cerere care necesită credențiale (browserele resping această combinație).

allowed_methods

Lista de metode (['GET', 'POST']) pe care browserul le poate utiliza cross-origin. None înseamnă oricare.

expose_headers

Lista de nume de antete de răspuns pe care browserul le poate expune către JavaScript.

allowed_headers

Lista de nume de antete de cerere pe care clienții le pot include cross-origin. None înseamnă oricare (reflectă Access-Control-Request-Headers din preflight).

max_age

Numărul de secunde cât browserul poate stoca în cache rezultatul preflight. Omiterea lui înseamnă că browserul revalidează fiecare preflight.

handle_cors

Dacă este False, clasa este configurată, dar nu se atașează efectiv – util când dorești să combini manual ieșirea get_cors_headers() cu alt middleware.

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

Se atașează la app dacă construcția a fost amânată.

get_cors_headers(request) dict

Calculează setul de antete Access-Control-* care se aplică cererii request. Folosit intern de hook-ul de după cerere; aplicațiile îl pot apela direct atunci când emit antete CORS din middleware personalizat.

allowed_origins: list | str | None

Lista configurată de origini sau literalul '*'. Reflectă argumentul de constructor allowed_origins; reatribuie-l în timpul execuției pentru a schimba politica fără a reconstrui obiectul.

allow_credentials: bool

Dacă Access-Control-Allow-Credentials: true este emis pentru cererile care corespund. Reflectă argumentul de constructor allow_credentials.

allowed_methods: list | None

Lista de nume de metode permise cross-origin sau None pentru „oricare”. Reflectă argumentul de constructor allowed_methods.

expose_headers: list | None

Lista de antete de răspuns pe care browserul le poate expune către JavaScript sau None pentru a omite antetul Access-Control-Expose-Headers. Reflectă argumentul de constructor expose_headers.

allowed_headers: list | None

Lista de nume de antete de cerere acceptate cross-origin, scrise cu litere mici, sau None pentru „reflectă ceea ce a cerut preflight-ul”. Reflectă argumentul de constructor allowed_headers (constructorul transformă lista în litere mici înainte de a o stoca).

max_age: int | None

Numărul de secunde cât browserul poate stoca în cache răspunsul preflight sau None pentru a omite antetul Access-Control-Max-Age. Reflectă argumentul de constructor max_age.

Exemplu:

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}

Cererea preflight OPTIONS este tratată automat; camera returnează antetele Access-Control-* corespunzătoare și 204 No Content. Răspunsurile efective GET / POST / etc. primesc antetul Access-Control-Allow-Origin prin hook-ul de după cerere înregistrat.