diff options
| author | InvalidInterrupt <InvalidInterrupt@users.noreply.github.com> | 2017-04-11 17:35:17 -0700 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2017-04-17 22:27:59 -0400 |
| commit | 5d556d2aaf64a4181b121e3cb51009d59f02869e (patch) | |
| tree | a8823972b1a189849d7bd38bc6fc0b23590ece0d | |
| parent | 844ae40a7cdcb1738ca3a2e8f13bb6b8c2e22efd (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.py | 5 | ||||
| -rw-r--r-- | django/contrib/sessions/backends/signed_cookies.py | 3 | ||||
| -rw-r--r-- | docs/releases/1.11.1.txt | 3 | ||||
| -rw-r--r-- | tests/sessions_tests/tests.py | 5 |
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' |
