microdot.cors --- การแชร์ทรัพยากรข้ามต้นทาง (Cross-Origin Resource Sharing)

เพิ่มส่วนหัวที่เบราว์เซอร์ต้องการเพื่ออนุญาตให้ JavaScript ที่ทำงานบนต้นทางหนึ่งเรียก endpoint ที่โฮสต์บนกล้องซึ่งอยู่คนละต้นทางได้ คลาสนี้จะเชื่อมต่อตัวเองเข้ากับตัวจัดการ OPTIONS ของแอปพลิเคชัน (สำหรับคำขอ preflight) และ hook หลังคำขอ (สำหรับส่วนหัว 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 เพื่อให้เบราว์เซอร์ส่งคุกกี้และส่วนหัว auth พร้อมคำขอข้ามต้นทาง ไม่สามารถใช้ร่วมกับ allowed_origins='*' สำหรับคำขอที่ต้องการข้อมูลรับรอง (เบราว์เซอร์จะปฏิเสธการรวมกันนั้น)

allowed_methods

รายการ method (['GET', 'POST']) ที่เบราว์เซอร์อาจใช้ข้ามต้นทางได้ None หมายถึงอนุญาตทั้งหมด

expose_headers

รายการชื่อส่วนหัวของการตอบกลับที่เบราว์เซอร์อาจเปิดเผยต่อ JavaScript

allowed_headers

รายการชื่อส่วนหัวของคำขอที่ไคลเอนต์อาจรวมไว้ข้ามต้นทางได้ None หมายถึงอนุญาตทั้งหมด (สะท้อน Access-Control-Request-Headers ของ preflight)

max_age

จำนวนวินาทีที่เบราว์เซอร์อาจแคชผลลัพธ์ preflight ไว้ได้ หากละเว้นจะทำให้เบราว์เซอร์ตรวจสอบทุก preflight ใหม่

handle_cors

ถ้าเป็น False คลาสจะถูกกำหนดค่าแต่ไม่เชื่อมต่อตัวเองจริงๆ -- มีประโยชน์เมื่อต้องการรวมผลลัพธ์ get_cors_headers() กับ middleware อื่นด้วยตนเอง

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

เชื่อมต่อกับ app หากการก่อสร้างถูกเลื่อนไว้

get_cors_headers(request) dict

คำนวณชุดส่วนหัว Access-Control-* ที่ใช้กับ request ใช้ภายในโดย hook หลังคำขอ แอปพลิเคชันสามารถเรียกได้โดยตรงเมื่อส่งส่วนหัว CORS จาก middleware ที่กำหนดเอง

allowed_origins: list | str | None

รายการต้นทางที่กำหนดค่าไว้ หรือตัวอักษร '*' สะท้อนอาร์กิวเมนต์ constructor allowed_origins สามารถกำหนดใหม่ขณะรันไทม์เพื่อเปลี่ยนนโยบายโดยไม่ต้องสร้างออบเจ็กต์ใหม่

allow_credentials: bool

ว่าจะส่ง Access-Control-Allow-Credentials: true ในคำขอที่ตรงกันหรือไม่ สะท้อนอาร์กิวเมนต์ constructor allow_credentials

allowed_methods: list | None

รายการชื่อ method ที่อนุญาตข้ามต้นทาง หรือ None สำหรับ "ทั้งหมด" สะท้อนอาร์กิวเมนต์ constructor allowed_methods

expose_headers: list | None

รายการส่วนหัวของการตอบกลับที่เบราว์เซอร์อาจเปิดเผยต่อ JavaScript หรือ None เพื่อละเว้นส่วนหัว Access-Control-Expose-Headers สะท้อนอาร์กิวเมนต์ constructor expose_headers

allowed_headers: list | None

รายการชื่อส่วนหัวของคำขอที่ยอมรับข้ามต้นทาง (ตัวพิมพ์เล็ก) หรือ None สำหรับ "สะท้อนสิ่งที่ preflight ขอมา" สะท้อนอาร์กิวเมนต์ constructor allowed_headers (constructor จะแปลงรายการให้เป็นตัวพิมพ์เล็กก่อนเก็บ)

max_age: int | None

จำนวนวินาทีที่เบราว์เซอร์อาจแคชการตอบกลับ preflight ไว้ หรือ None เพื่อละเว้นส่วนหัว Access-Control-Max-Age สะท้อนอาร์กิวเมนต์ constructor 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}

คำขอ preflight OPTIONS จะถูกจัดการโดยอัตโนมัติ กล้องจะคืนส่วนหัว Access-Control-* ที่เหมาะสมและ 204 No Content การตอบกลับ GET / POST / ฯลฯ ที่แท้จริงจะได้รับส่วนหัว Access-Control-Allow-Origin ผ่าน hook หลังคำขอที่ลงทะเบียนไว้