microdot.cors --- Berbagi Sumber Daya Lintas Asal

Menambahkan header yang diperlukan browser untuk mengizinkan JavaScript yang berjalan di satu asal untuk memanggil endpoint yang di-host kamera pada asal yang berbeda. Kelas ini mengaitkan dirinya ke handler OPTIONS aplikasi (untuk permintaan preflight) dan hook setelah-permintaan (untuk header Access-Control-* pada respons normal).

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

Instans microdot.Microdot yang akan dilampirkan. Boleh None untuk menunda pemasangan; panggil initialize() nanti.

allowed_origins

Daftar string asal (["https://app.example.com"]) atau literal '*' untuk mengizinkan semua asal. Asal yang tidak cocok dengan daftar ini tidak mendapatkan header CORS, yang diinterpretasikan browser sebagai "permintaan ini tidak diizinkan".

allow_credentials

Jika True, tambahkan Access-Control-Allow-Credentials: true agar browser mengirimkan cookie dan header auth dengan permintaan lintas asal. Tidak dapat digunakan dengan allowed_origins='*' untuk permintaan yang membutuhkan kredensial (browser menolak kombinasi tersebut).

allowed_methods

Daftar metode (['GET', 'POST']) yang boleh digunakan browser secara lintas asal. None berarti semua.

expose_headers

Daftar nama header respons yang boleh diekspos browser ke JavaScript.

allowed_headers

Daftar nama header permintaan yang boleh disertakan klien secara lintas asal. None berarti semua (menggemakan Access-Control-Request-Headers dari preflight).

max_age

Detik yang boleh digunakan browser untuk menyimpan cache hasil preflight. Jika tidak diisi, browser memvalidasi ulang setiap preflight.

handle_cors

Jika False, kelas dikonfigurasi tetapi tidak benar-benar melampirkan dirinya -- berguna saat Anda ingin menggabungkan keluaran get_cors_headers()-nya secara manual dengan middleware lain.

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

Lampirkan ke app jika konstruksi ditunda.

get_cors_headers(request) dict

Hitung kumpulan header Access-Control-* yang berlaku untuk request. Digunakan secara internal oleh hook setelah-permintaan; aplikasi dapat memanggilnya langsung saat memancarkan header CORS dari middleware kustom.

allowed_origins: list | str | None

Daftar asal yang dikonfigurasi, atau literal '*'. Mencerminkan argumen konstruktor allowed_origins; tetapkan ulang saat runtime untuk mengubah kebijakan tanpa membangun ulang objek.

allow_credentials: bool

Apakah Access-Control-Allow-Credentials: true dipancarkan pada permintaan yang cocok. Mencerminkan argumen konstruktor allow_credentials.

allowed_methods: list | None

Daftar nama metode yang diizinkan secara lintas asal, atau None untuk "semua". Mencerminkan argumen konstruktor allowed_methods.

expose_headers: list | None

Daftar header respons yang boleh diekspos browser ke JavaScript, atau None untuk menghilangkan header Access-Control-Expose-Headers. Mencerminkan argumen konstruktor expose_headers.

allowed_headers: list | None

Daftar nama header permintaan yang diterima secara lintas asal, huruf kecil, atau None untuk "gemakan apa pun yang diminta preflight". Mencerminkan argumen konstruktor allowed_headers (konstruktor mengubah daftar menjadi huruf kecil sebelum menyimpannya).

max_age: int | None

Detik yang boleh digunakan browser untuk menyimpan cache respons preflight, atau None untuk menghilangkan header Access-Control-Max-Age. Mencerminkan argumen konstruktor max_age.

Contoh:

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}

Permintaan OPTIONS preflight ditangani secara otomatis; kamera mengembalikan header Access-Control-* yang sesuai dan 204 No Content. Respons GET / POST / dll. yang sebenarnya mendapatkan header Access-Control-Allow-Origin melalui hook setelah-permintaan yang terdaftar.