1
+ from __future__ import annotations
2
+
3
+ from importlib import import_module
4
+ from typing import Any
5
+
1
6
from django .conf import settings
2
- from django .contrib .auth import authenticate
7
+ from django .contrib .auth import authenticate , get_user
3
8
from django .contrib .contenttypes .models import ContentType
9
+ from django .contrib .sessions .backends .base import SessionBase
4
10
from django .db .models import Model
5
- from django .http import HttpResponse
11
+ from django .http import HttpRequest , HttpResponse
6
12
from django .shortcuts import redirect , resolve_url
7
13
from django .template import TemplateDoesNotExist , engines , loader
8
14
from django .utils .crypto import get_random_string
@@ -28,12 +34,17 @@ def render_string(self, html, context):
28
34
return render_template_string (self .strategy .request , html , context )
29
35
30
36
37
+ def create_session (session_key : str | None = None ) -> SessionBase :
38
+ engine = import_module (settings .SESSION_ENGINE )
39
+ return engine .SessionStore (session_key )
40
+
41
+
31
42
class DjangoStrategy (BaseStrategy ):
32
43
DEFAULT_TEMPLATE_STRATEGY = DjangoTemplateStrategy
33
44
34
- def __init__ (self , storage , request = None , tpl = None ):
35
- self .request = request
36
- self .session = request .session if request else {}
45
+ def __init__ (self , storage , request : None | HttpRequest = None , tpl = None ):
46
+ self .request : HttpRequest = request
47
+ self .session : SessionBase = request .session if request else create_session ()
37
48
super ().__init__ (storage , tpl )
38
49
39
50
def get_setting (self , name ):
@@ -149,3 +160,16 @@ def from_session_value(self, val):
149
160
def get_language (self ):
150
161
"""Return current language"""
151
162
return get_language ()
163
+
164
+ def get_session_id (self ) -> str | None :
165
+ return self .session .session_key
166
+
167
+ def restore_session (self , session_id : str , kwargs : dict [str , Any ]) -> None :
168
+ # Load session
169
+ self .request .session = self .session = create_session (session_id )
170
+ # Update request user
171
+ self .request .user = get_user (self .request )
172
+ if "user" in kwargs :
173
+ kwargs ["user" ] = self .request .user
174
+ # Rotate session key to avoid reuse
175
+ self .session .cycle_key ()
0 commit comments