microdot.cors — שיתוף משאבים בין מקורות (CORS)

מוסיף את הכותרות שדפדפן זקוק להן כדי לאפשר ל-JavaScript הרץ במקור אחד לקרוא לנקודות הקצה המתארחות במצלמה שלכם במקור אחר. המחלקה משלבת את עצמה ב-handler של OPTIONS של היישום (עבור בקשות preflight) ובהוק שאחרי הבקשה (עבור כותרות 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 כך שהדפדפן שולח cookies וכותרות אימות בבקשות בין-מקוריות. לא ניתן להשתמש עם allowed_origins='*' עבור כל בקשה הזקוקה לאישורים (דפדפנים דוחים שילוב זה).

allowed_methods

רשימת מתודות (['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. בשימוש פנימי על ידי ההוק שאחרי הבקשה; יישומים יכולים לקרוא לה ישירות בעת פליטת כותרות CORS מ-middleware מותאם אישית.

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 עבור ”הדהד את מה שה-preflight ביקש“. משקפת את ארגומנט הבנאי allowed_headers (הבנאי ממיר את הרשימה לאותיות קטנות לפני אחסונה).

max_age: int | None

שניות שהדפדפן רשאי לשמור במטמון את תגובת ה-preflight, או 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}

בקשת ה-preflight OPTIONS מטופלת אוטומטית; המצלמה מחזירה את כותרות ה-Access-Control-* המתאימות ו-204 No Content. תגובות GET / POST / וכו« בפועל מקבלות את כותרת Access-Control-Allow-Origin באמצעות ההוק הרשום שאחרי הבקשה.