microdot.cors — Partilha de Recursos entre Origens (CORS)

Adiciona os cabeçalhos necessários para que o navegador permita que JavaScript em execução numa origem chame os endpoints alojados na câmara a partir de uma origem diferente. A classe associa-se ao handler OPTIONS da aplicação (para pedidos preflight) e ao hook pós-pedido (para os cabeçalhos Access-Control-* nas respostas normais).

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

A instância de microdot.Microdot à qual se associa. Pode ser None para diferir a associação; nesse caso, chame initialize() mais tarde.

allowed_origins

Uma lista de cadeias de origem (["https://app.example.com"]) ou o literal '*' para permitir qualquer origem. As origens que não correspondam a esta lista não recebem cabeçalhos CORS, o que o navegador interpreta como «este pedido não é permitido».

allow_credentials

Se True, adiciona Access-Control-Allow-Credentials: true para que o navegador envie cookies e cabeçalhos de autenticação em pedidos entre origens. Não pode ser utilizado com allowed_origins='*' em pedidos que necessitem de credenciais (os navegadores rejeitam essa combinação).

allowed_methods

Lista de métodos (['GET', 'POST']) que o navegador pode utilizar entre origens. None significa qualquer método.

expose_headers

Lista de nomes de cabeçalhos de resposta que o navegador pode expor ao JavaScript.

allowed_headers

Lista de nomes de cabeçalhos de pedido que os clientes podem incluir em pedidos entre origens. None significa qualquer um (replica o Access-Control-Request-Headers do preflight).

max_age

Segundos durante os quais o navegador pode colocar em cache o resultado do preflight. Se omitido, o navegador revalida cada preflight.

handle_cors

Se False, a classe fica configurada mas não se associa efetivamente — útil quando se pretende combinar manualmente o resultado de get_cors_headers() com outro middleware.

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

Associa-se a app se a construção foi diferida.

get_cors_headers(request) dict

Calcula o conjunto de cabeçalhos Access-Control-* que se aplicam a request. Utilizado internamente pelo hook pós-pedido; as aplicações podem chamá-lo diretamente ao emitir cabeçalhos CORS a partir de middleware personalizado.

allowed_origins: list | str | None

A lista de origens configurada, ou o literal '*'. Espelha o argumento de construção allowed_origins; reatribua em tempo de execução para alterar a política sem reconstruir o objeto.

allow_credentials: bool

Indica se Access-Control-Allow-Credentials: true é emitido nos pedidos correspondentes. Espelha o argumento de construção allow_credentials.

allowed_methods: list | None

Lista de nomes de métodos permitidos entre origens, ou None para «qualquer». Espelha o argumento de construção allowed_methods.

expose_headers: list | None

Lista de cabeçalhos de resposta que o navegador pode expor ao JavaScript, ou None para omitir o cabeçalho Access-Control-Expose-Headers. Espelha o argumento de construção expose_headers.

allowed_headers: list | None

Lista de nomes de cabeçalhos de pedido aceites entre origens, em minúsculas, ou None para «replicar o que o preflight pediu». Espelha o argumento de construção allowed_headers (o construtor coloca a lista em minúsculas antes de a armazenar).

max_age: int | None

Segundos durante os quais o navegador pode colocar em cache a resposta de preflight, ou None para omitir o cabeçalho Access-Control-Max-Age. Espelha o argumento de construção max_age.

Exemplo:

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}

O pedido preflight OPTIONS é tratado automaticamente; a câmara devolve os cabeçalhos Access-Control-* apropriados e 204 No Content. As respostas GET / POST / etc. recebem o cabeçalho Access-Control-Allow-Origin através do hook pós-pedido registado.