microdot.cors --- 跨來源資源共用

新增瀏覽器所需的標頭,以允許在某個來源執行的 JavaScript 呼叫位於不同來源的相機代管端點。此類別會自行接入應用程式的 OPTIONS 處理常式(用於預檢請求)與請求後掛勾(用於一般回應上的 Access-Control-* 標頭)。

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

要附加的 microdot.Microdot 實例。可為 None 以延後附加;稍後再呼叫 initialize()

allowed_origins

來源字串清單(["https://app.example.com"])或字面值 '*' 以允許任何來源。與此清單不符的來源不會取得 CORS 標頭,瀏覽器會將其解讀為「此請求不被允許」。

allow_credentials

若為 True,則新增 Access-Control-Allow-Credentials: true,使瀏覽器在跨來源請求中傳送 cookie 與驗證標頭。對於任何需要憑證的請求,不能與 allowed_origins='*' 一起使用(瀏覽器會拒絕此組合)。

allowed_methods

瀏覽器可用於跨來源的方法清單(['GET', 'POST'])。None 表示任意。

expose_headers

瀏覽器可向 JavaScript 公開的回應標頭名稱清單。

allowed_headers

用戶端可於跨來源請求中包含的請求標頭名稱清單。None 表示任意(會回傳預檢請求的 Access-Control-Request-Headers)。

max_age

瀏覽器可快取預檢結果的秒數。略過此項表示瀏覽器會在每次預檢時重新驗證。

handle_cors

若為 False,則此類別已設定但不會實際附加自身 —— 當你想手動將其 get_cors_headers() 輸出與其他中介軟體結合時相當有用。

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

若建構時延後附加,則附加至 app

get_cors_headers(request) dict

計算適用於 requestAccess-Control-* 標頭集合。由請求後掛勾在內部使用;當應用程式從自訂中介軟體發出 CORS 標頭時,可直接呼叫它。

allowed_origins: list | str | None

已設定的來源清單,或字面值 '*'。對應 allowed_origins 建構函式引數;可於執行階段重新指定,以在不重建物件的情況下變更原則。

allow_credentials: bool

是否在符合條件的請求上發出 Access-Control-Allow-Credentials: true。對應 allow_credentials 建構函式引數。

allowed_methods: list | None

允許跨來源的方法名稱清單,或表示「任意」的 None。對應 allowed_methods 建構函式引數。

expose_headers: list | None

瀏覽器可向 JavaScript 公開的回應標頭清單,或為 None 以省略 Access-Control-Expose-Headers 標頭。對應 expose_headers 建構函式引數。

allowed_headers: list | None

可跨來源接受的請求標頭名稱清單(以小寫表示),或為 None 表示「回傳預檢請求所要求的任何內容」。對應 allowed_headers 建構函式引數(建構函式會在儲存前將清單轉為小寫)。

max_age: int | None

瀏覽器可快取預檢回應的秒數,或為 None 以省略 Access-Control-Max-Age 標頭。對應 max_age 建構函式引數。

範例::

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}

預檢 OPTIONS 請求會自動處理;相機會回傳適當的 Access-Control-* 標頭與 204 No Content。實際的 GETPOST 等回應會透過已註冊的請求後掛勾取得 Access-Control-Allow-Origin 標頭。