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 อื่นด้วยตนเอง
- 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
ตัวอย่าง:
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 หลังคำขอที่ลงทะเบียนไว้