FastAPI CORSMiddleware: безопасный CORS для SPA (список и regex)

Готовая настройка CORS для FastAPI: явный список доменов и шаблон поддоменов, поддержка credentials, нужные заголовки и методы. Прод и dev из .env.
# app/main.py
import os
from fastapi import FastAPI
from starlette.middleware.cors import CORSMiddleware

app = FastAPI()

# Вариант 1: явный список доменов из .env
# CORS_ORIGINS="https://app.example.com,https://admin.example.com,http://localhost:5173"
origins = [o.strip() for o in os.getenv("CORS_ORIGINS", "").split(",") if o.strip()]

# Вариант 2: разрешить все поддомены example.com
origin_regex = os.getenv("CORS_REGEX", r"https://([a-z0-9-]+\.)*example\.com")

app.add_middleware(
    CORSMiddleware,
    allow_origins=origins if origins else [],     # если пусто — используем regex ниже
    allow_origin_regex=origin_regex if not origins else None,
    allow_credentials=True,
    allow_methods=["GET","POST","PUT","PATCH","DELETE","OPTIONS"],
    allow_headers=["Authorization","Content-Type","X-Requested-With"],
    expose_headers=["Content-Disposition"],       # чтобы скачивания работали корректно
    max_age=86400,                                # кеш preflight в браузере
)