summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Kroenke <tobias@kroenke.de>2016-04-20 10:36:59 +0200
committerTim Graham <timograham@gmail.com>2016-04-20 13:11:33 -0400
commit845d43e37ed0086baa55ba791a5d386da54e943b (patch)
treebd3409260f9311c9cd2efd2485d4a1948eaa2bf1
parentebb55a247c0f060f3e2cf0e363137106385bda0f (diff)
downloaddjango-845d43e37ed0086baa55ba791a5d386da54e943b.tar.gz
[1.9.x] Fixed #26520 -- Fixed a regression where SessionBase.pop() didn't return a KeyError.
Backport of b040ac06ebba2348cece7390b88f746d2c91d07b from master
-rw-r--r--django/contrib/sessions/backends/base.py7
-rw-r--r--docs/releases/1.9.6.txt3
-rw-r--r--docs/topics/http/sessions.txt2
-rw-r--r--tests/sessions_tests/tests.py4
4 files changed, 13 insertions, 3 deletions
diff --git a/django/contrib/sessions/backends/base.py b/django/contrib/sessions/backends/base.py
index 718cc54215..dd4979e957 100644
--- a/django/contrib/sessions/backends/base.py
+++ b/django/contrib/sessions/backends/base.py
@@ -35,6 +35,8 @@ class SessionBase(object):
TEST_COOKIE_NAME = 'testcookie'
TEST_COOKIE_VALUE = 'worked'
+ __not_given = object()
+
def __init__(self, session_key=None):
self._session_key = session_key
self.accessed = False
@@ -58,9 +60,10 @@ class SessionBase(object):
def get(self, key, default=None):
return self._session.get(key, default)
- def pop(self, key, default=None):
+ def pop(self, key, default=__not_given):
self.modified = self.modified or key in self._session
- return self._session.pop(key, default)
+ args = () if default is self.__not_given else (default,)
+ return self._session.pop(key, *args)
def setdefault(self, key, value):
if key in self._session:
diff --git a/docs/releases/1.9.6.txt b/docs/releases/1.9.6.txt
index 8b48f803c7..e505ee5923 100644
--- a/docs/releases/1.9.6.txt
+++ b/docs/releases/1.9.6.txt
@@ -18,3 +18,6 @@ Bugfixes
* Prevented ``makemigrations`` from generating infinite migrations for a model
field that references a ``functools.partial`` (:ticket:`26475`).
+
+* Fixed a regression where ``SessionBase.pop()`` returned ``None`` rather than
+ raising a ``KeyError`` for nonexistent values (:ticket:`26520`).
diff --git a/docs/topics/http/sessions.txt b/docs/topics/http/sessions.txt
index c495bb5b4c..b72ce2f0d0 100644
--- a/docs/topics/http/sessions.txt
+++ b/docs/topics/http/sessions.txt
@@ -205,7 +205,7 @@ You can edit it multiple times.
Example: ``fav_color = request.session.get('fav_color', 'red')``
- .. method:: pop(key, default=None)
+ .. method:: pop(key, default=__not_given)
Example: ``fav_color = request.session.pop('fav_color', 'blue')``
diff --git a/tests/sessions_tests/tests.py b/tests/sessions_tests/tests.py
index 50f14076e5..a28a5c8624 100644
--- a/tests/sessions_tests/tests.py
+++ b/tests/sessions_tests/tests.py
@@ -87,6 +87,10 @@ class SessionTestsMixin(object):
self.assertTrue(self.session.accessed)
self.assertFalse(self.session.modified)
+ def test_pop_no_default_keyerror_raised(self):
+ with self.assertRaises(KeyError):
+ self.session.pop('some key')
+
def test_setdefault(self):
self.assertEqual(self.session.setdefault('foo', 'bar'), 'bar')
self.assertEqual(self.session.setdefault('foo', 'baz'), 'bar')