microdot.cors — Partage des ressources entre origines (CORS)

Ajoute les en-têtes dont un navigateur a besoin pour permettre au JavaScript s’exécutant sur une origine d’appeler vos points de terminaison hébergés par la caméra sur une origine différente. La classe se branche dans le gestionnaire OPTIONS de l’application (pour les requêtes preflight) et dans le hook after-request (pour les en-têtes Access-Control-* des réponses 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

L’instance microdot.Microdot à laquelle s’attacher. Peut être None pour différer l’attachement ; appelez initialize() plus tard.

allowed_origins

Une liste de chaînes d’origine (["https://app.example.com"]) ou le littéral '*' pour autoriser n’importe quelle origine. Les origines qui ne correspondent pas à cette liste n’obtiennent aucun en-tête CORS, ce que le navigateur interprète comme « cette requête n’est pas autorisée ».

allow_credentials

Si True, ajoute Access-Control-Allow-Credentials: true pour que le navigateur envoie les cookies et les en-têtes d’authentification avec les requêtes inter-origines. Ne peut pas être utilisé avec allowed_origins='*' pour toute requête nécessitant des identifiants (les navigateurs rejettent cette combinaison).

allowed_methods

Liste des méthodes (['GET', 'POST']) que le navigateur peut utiliser entre origines. None signifie n’importe laquelle.

expose_headers

Liste des noms d’en-têtes de réponse que le navigateur peut exposer au JavaScript.

allowed_headers

Liste des noms d’en-têtes de requête que les clients peuvent inclure entre origines. None signifie n’importe lequel (renvoie en écho le Access-Control-Request-Headers de la requête preflight).

max_age

Nombre de secondes pendant lesquelles le navigateur peut mettre en cache le résultat du preflight. L’omettre signifie que le navigateur revalide chaque preflight.

handle_cors

Si False, la classe est configurée mais ne s’attache pas réellement – utile lorsque vous voulez combiner manuellement sa sortie get_cors_headers() avec d’autres middlewares.

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

S’attache à app si la construction a été différée.

get_cors_headers(request) dict

Calcule l’ensemble des en-têtes Access-Control-* qui s’appliquent à request. Utilisé en interne par le hook after-request ; les applications peuvent l’appeler directement lorsqu’elles émettent des en-têtes CORS depuis un middleware personnalisé.

allowed_origins: list | str | None

La liste configurée d’origines, ou le littéral '*'. Reflète l’argument de constructeur allowed_origins ; réaffectez à l’exécution pour modifier la politique sans reconstruire l’objet.

allow_credentials: bool

Indique si Access-Control-Allow-Credentials: true est émis sur les requêtes correspondantes. Reflète l’argument de constructeur allow_credentials.

allowed_methods: list | None

Liste des noms de méthodes autorisés entre origines, ou None pour « n’importe laquelle ». Reflète l’argument de constructeur allowed_methods.

expose_headers: list | None

Liste des en-têtes de réponse que le navigateur peut exposer au JavaScript, ou None pour omettre l’en-tête Access-Control-Expose-Headers. Reflète l’argument de constructeur expose_headers.

allowed_headers: list | None

Liste des noms d’en-têtes de requête acceptés entre origines, en minuscules, ou None pour « renvoyer en écho ce que le preflight a demandé ». Reflète l’argument de constructeur allowed_headers (le constructeur met la liste en minuscules avant de la stocker).

max_age: int | None

Nombre de secondes pendant lesquelles le navigateur peut mettre en cache la réponse au preflight, ou None pour omettre l’en-tête Access-Control-Max-Age. Reflète l’argument de constructeur max_age.

Exemple

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 requête preflight OPTIONS est traitée automatiquement ; la caméra renvoie les en-têtes Access-Control-* appropriés et 204 No Content. Les réponses réelles aux GET / POST / etc. récupèrent l’en-tête Access-Control-Allow-Origin via le hook after-request enregistré.