Skip to content

Commit b3299c0

Browse files
committed
feat: support for session storing and restoring
This is a Django implementation for changes introduced in python-social-auth/social-core#1159. Fixes #481
1 parent 2627fb1 commit b3299c0

File tree

1 file changed

+29
-5
lines changed

1 file changed

+29
-5
lines changed

social_django/strategy.py

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
1+
from __future__ import annotations
2+
3+
from importlib import import_module
4+
from typing import Any
5+
16
from django.conf import settings
2-
from django.contrib.auth import authenticate
7+
from django.contrib.auth import authenticate, get_user
38
from django.contrib.contenttypes.models import ContentType
9+
from django.contrib.sessions.backends.base import SessionBase
410
from django.db.models import Model
5-
from django.http import HttpResponse
11+
from django.http import HttpRequest, HttpResponse
612
from django.shortcuts import redirect, resolve_url
713
from django.template import TemplateDoesNotExist, engines, loader
814
from django.utils.crypto import get_random_string
@@ -28,12 +34,17 @@ def render_string(self, html, context):
2834
return render_template_string(self.strategy.request, html, context)
2935

3036

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+
3142
class DjangoStrategy(BaseStrategy):
3243
DEFAULT_TEMPLATE_STRATEGY = DjangoTemplateStrategy
3344

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()
3748
super().__init__(storage, tpl)
3849

3950
def get_setting(self, name):
@@ -149,3 +160,16 @@ def from_session_value(self, val):
149160
def get_language(self):
150161
"""Return current language"""
151162
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

Comments
 (0)