summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorInvalidInterrupt <InvalidInterrupt@users.noreply.github.com>2017-04-11 17:35:17 -0700
committerTim Graham <timograham@gmail.com>2017-04-17 22:27:59 -0400
commit5d556d2aaf64a4181b121e3cb51009d59f02869e (patch)
treea8823972b1a189849d7bd38bc6fc0b23590ece0d
parent844ae40a7cdcb1738ca3a2e8f13bb6b8c2e22efd (diff)
[1.11.x] Fixed #28066 -- Prevented SessionBase.cycle_key() from discarding data.
Backport of dda596ca3296f5b2574cf4876a4e176594f52834 from master
-rw-r--r--django/contrib/sessions/backends/base.py5
-rw-r--r--django/contrib/sessions/backends/signed_cookies.py3
-rw-r--r--docs/releases/1.11.1.txt3
-rw-r--r--tests/sessions_tests/tests.py5
4 files changed, 10 insertions, 6 deletions
diff --git a/django/contrib/sessions/backends/base.py b/django/contrib/sessions/backends/base.py
index 40c557ba0b..8e09fd8d80 100644
--- a/django/contrib/sessions/backends/base.py
+++ b/django/contrib/sessions/backends/base.py
@@ -306,10 +306,7 @@ class SessionBase(object):
"""
Creates a new session key, while retaining the current session data.
"""
- try:
- data = self._session_cache
- except AttributeError:
- data = {}
+ data = self._session
key = self.session_key
self.create()
self._session_cache = data
diff --git a/django/contrib/sessions/backends/signed_cookies.py b/django/contrib/sessions/backends/signed_cookies.py
index f4c085fb59..c790fbe90f 100644
--- a/django/contrib/sessions/backends/signed_cookies.py
+++ b/django/contrib/sessions/backends/signed_cookies.py
@@ -74,9 +74,8 @@ class SessionStore(SessionBase):
generate a secure url-safe Base64-encoded string of data as our
session key.
"""
- session_cache = getattr(self, '_session_cache', {})
return signing.dumps(
- session_cache, compress=True,
+ self._session, compress=True,
salt='django.contrib.sessions.backends.signed_cookies',
serializer=self.serializer,
)
diff --git a/docs/releases/1.11.1.txt b/docs/releases/1.11.1.txt
index 953a6e8889..41f82a0c63 100644
--- a/docs/releases/1.11.1.txt
+++ b/docs/releases/1.11.1.txt
@@ -27,3 +27,6 @@ Bugfixes
* Restored ``BoundField``\s without any ``choices`` evaluating to ``True``
(:ticket:`28058`).
+
+* Prevented ``SessionBase.cycle_key()`` from losing session data if
+ ``_session_cache`` isn't populated (:ticket:`28066`).
diff --git a/tests/sessions_tests/tests.py b/tests/sessions_tests/tests.py
index ae57f1d919..7f32ca8be2 100644
--- a/tests/sessions_tests/tests.py
+++ b/tests/sessions_tests/tests.py
@@ -189,8 +189,13 @@ class SessionTestsMixin(object):
self.assertEqual(list(self.session.items()), prev_data)
def test_cycle_with_no_session_cache(self):
+ self.session['a'], self.session['b'] = 'c', 'd'
+ self.session.save()
+ prev_data = list(self.session.items())
+ self.session = self.backend(self.session.session_key)
self.assertFalse(hasattr(self.session, '_session_cache'))
self.session.cycle_key()
+ self.assertEqual(list(self.session.items()), prev_data)
def test_save_doesnt_clear_data(self):
self.session['a'] = 'b'