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 を追加し、ブラウザがクロスオリジンリクエストでクッキーや認証ヘッダーを送信するようにします。資格情報を必要とするリクエストでは 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

request に適用される Access-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 に公開できる応答ヘッダーのリスト、または Access-Control-Expose-Headers ヘッダーを省略する場合の None。コンストラクタ引数 expose_headers を反映します。

allowed_headers: list | None

クロスオリジンで受け入れられるリクエストヘッダー名のリスト(小文字化済み)、または「プリフライトが要求したものをそのまま返す」を表す None。コンストラクタ引数 allowed_headers を反映します(コンストラクタは格納前にリストを小文字化します)。

max_age: int | None

ブラウザがプリフライト応答をキャッシュできる秒数、または Access-Control-Max-Age ヘッダーを省略する場合の None。コンストラクタ引数 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 ヘッダーを取得します。