42
42
43
43
44
44
class Storage :
45
- __slots__ = "pool"
45
+ __slots__ = ( "pool" , "_keys" )
46
46
47
- def __init__ (self , * , redis : Redis ) -> None :
48
- self .pool : redis .Redis = redis .pool
47
+ def __init__ (self , * , redis : Redis | None = None ) -> None :
48
+ self .pool : redis .Redis | None = redis .pool if redis else None
49
+ self ._keys : dict [str , Any ] = {}
49
50
50
51
async def get (self , data : dict [str , Any ]) -> dict [str , Any ]:
51
52
expiry : datetime .datetime = datetime .datetime .fromisoformat (data ["expiry" ])
52
53
key : str = data ["_session_secret_key" ]
53
54
54
55
if expiry <= datetime .datetime .now ():
55
- await self .pool . delete (key ) # type: ignore
56
+ await self .delete (key )
56
57
return {}
57
58
58
- session : Any = await self .pool .get (key ) # type: ignore
59
+ if self .pool :
60
+ session : Any = await self .pool .get (key ) # type: ignore
61
+ else :
62
+ session : Any = self ._keys .get (key )
63
+
59
64
return json .loads (session ) if session else {}
60
65
61
66
async def set (self , key : str , value : dict [str , Any ], * , max_age : int ) -> None :
62
- await self .pool .set (key , json .dumps (value ), ex = max_age ) # type: ignore
67
+ if self .pool :
68
+ await self .pool .set (key , json .dumps (value ), ex = max_age ) # type: ignore
69
+ return
70
+
71
+ self ._keys [key ] = json .dumps (value )
63
72
64
73
async def delete (self , key : str ) -> None :
65
- await self .pool .delete (key ) # type: ignore
74
+ if self .pool :
75
+ await self .pool .delete (key ) # type: ignore
76
+ else :
77
+ self ._keys .pop (key , None )
66
78
67
79
68
80
class SessionMiddleware :
@@ -75,7 +87,7 @@ def __init__(
75
87
max_age : int | None = None ,
76
88
same_site : str = "lax" ,
77
89
secure : bool = True ,
78
- redis : Redis ,
90
+ redis : Redis | None = None ,
79
91
) -> None :
80
92
self .app : ASGIApp = app
81
93
self .name : str = name or "__session_cookie"
@@ -113,6 +125,8 @@ async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None:
113
125
scope ["session" ] = session
114
126
115
127
async def wrapper (message : Message ) -> None :
128
+ nonlocal original , session , cookie
129
+
116
130
if message ["type" ] != "http.response.start" :
117
131
await send (message )
118
132
return
0 commit comments