microdot.session — סשנים מבוססי עוגיות חתומות

מאגר מפתח/ערך לכל משתמש הנתמך על ידי jwt בעוגיית session יחידה. ה-JWT חתום בסוד הידוע רק ליישום, כך שהלקוח יכול לקרוא את העוגייה אך אינו יכול לשבש את המטען מבלי שהשרת יזהה זאת.

class Session

class microdot.session.Session(app: Microdot | None = None, secret_key: bytes | str | None = None, cookie_options: dict | None = None)
app

מופע ה-microdot.Microdot שעליו להתקין. אופציונלי; קרא ל-initialize() מאוחר יותר אם אינו ניתן.

secret_key

מפתח סימטרי המשמש לחתימת ה-JWT של הסשן. נדרש לפני שכל סשן נקרא או נכתב – גישה ל-get() ללא אחד מרימה ValueError. אחסן אותו מחוץ לבקרת המקור; במצלמה זהו בדרך כלל קובץ במערכת הקבצים FAT.

cookie_options

Dict של אפשרויות המועברות ל-microdot.Response.set_cookie() בכל פעם שעוגיית הסשן נכתבת. ברירות המחדל קובעות path='/' ו-http_only=True. הוסף secure=True עבור פריסות HTTPS-בלבד.

initialize(app: Microdot, secret_key=None, cookie_options=None)

מצרף ל-app אם הבנייה נדחתה. secret_key / cookie_options עוקפים את ערכי הבנאי אם ניתנים.

get(request) SessionDict

מחזיר את מילון הסשן עבור request. המילון מפוענח בעצלתיים מעוגיית ה-session בגישה הראשונה ונשמר במטמון ב-request.g._session לשארית הבקשה. עוגיות משובשות / שאינן ניתנות לחתימה מחזירות dict ריק.

encode(payload: dict, secret_key=None) str

מקודד את payload כ-JWT עם סוד הסשן. משמש פנימית; נחשף עבור קוראים הרוצים לטבוע אסימונים תואמים.

decode(session: str, secret_key=None) dict

מאמת ומפענח ערך סשן ממחרוזת-JWT. מחזיר {} בכל כשל אימות.

secret_key: bytes | str | None

סוד החתימה המשמש לחתום ולאמת את ה-JWT של הסשן. ניתן להגדרה לאחר הבנייה. None עד שמוגדר; קריאת הסשן ללא אחד מרימה ValueError.

cookie_options: dict

ה-dict של האפשרויות המוחלות על עוגיית הסשן כשהיא נכתבת, המועברות ל-microdot.Response.set_cookie(). ברירות המחדל קובעות path='/' ו-http_only=True לאחר ש-initialize() פועלת.

class SessionDict

class microdot.session.SessionDict(request, session_dict)

האובייקט דמוי-ה-dict המוחזר על ידי Session.get(). יורש מ-dict, כך שכל השינויים הסטנדרטיים עובדים; שתי מתודות נוספות מבצעות commit לשינויים בחזרה אל התגובה.

save()

כותב את הסשן (שיתכן ושונה) בחזרה אל התגובה כעוגיית session חדשה. ללא קריאה זו, עריכות במקום אובדות כשהבקשה מסתיימת.

delete()

מסיר את הסשן על ידי פליטת כותרת מחיקת-עוגייה על התגובה.

מעטרים ברמת המודול

microdot.session.with_session(f)

מעטר המעביר את מילון הסשן למטפל הנתיב כארגומנט שני:

from microdot import Microdot
from microdot.session import Session, with_session

app = Microdot()
Session(app, secret_key=load_secret())

@app.get('/counter')
@with_session
async def counter(request, session):
    session['n'] = session.get('n', 0) + 1
    session.save()
    return {'n': session['n']}

המעטר אינו שומר אוטומטית – קרא ל-SessionDict.save() כאשר הסשן שונה.

מטען הסשן עצמו הוא dict רגיל של Python המסודר (serialized) כ-JSON בתוך ה-JWT. שמור אותו קטן: כל בקשה וכל תגובה נושאות את העוגייה המלאה, ו-JWTs אינם מתוכננים לאחסון אובייקטים גדולים. עבור מצב לכל משתמש הגדול ממאות בתים בודדות, אחסן את הנתונים בצד השרת לפי מזהה סשן קטן.