This commit is contained in:
Yotam Ofek 2017-11-22 06:42:17 +00:00 committed by GitHub
commit d1cd7f051f
2 changed files with 34 additions and 5 deletions

View File

@ -373,19 +373,23 @@ class Request(object):
else: else:
self.auth = None self.auth = None
def __getattribute__(self, attr): def __getattr__(self, attr):
""" """
If an attribute does not exist on this instance, then we also attempt If an attribute does not exist on this instance, then we also attempt
to proxy it to the underlying HttpRequest object. to proxy it to the underlying HttpRequest object.
""" """
try: try:
return super(Request, self).__getattribute__(attr) return getattr(self._request, attr)
except AttributeError: except AttributeError:
info = sys.exc_info() outer_info = sys.exc_info()
# raise the 'original' AttributeError for the proxying Request object instead of the underlying
# HttpRequest object.
try: try:
return getattr(self._request, attr) self.__getattribute__(attr)
except AttributeError: except AttributeError:
six.reraise(info[0], info[1], info[2].tb_next) inner_info = sys.exc_info()
six.reraise(inner_info[0], inner_info[1], outer_info[2].tb_next)
@property @property
def DATA(self): def DATA(self):

View File

@ -249,3 +249,28 @@ class TestSecure(TestCase):
def test_default_secure_true(self): def test_default_secure_true(self):
request = Request(factory.get('/', secure=True)) request = Request(factory.get('/', secure=True))
assert request.scheme == 'https' assert request.scheme == 'https'
class TestWSGIRequestProxy(TestCase):
def test_access_inner_property(self):
wsgi_request = factory.get('/')
sentinel = object()
wsgi_request.__dict__['inner_property'] = sentinel
request = Request(wsgi_request)
assert request.inner_property is sentinel
def test_access_outer_property(self):
wsgi_request = factory.get('/')
inner_sentinel = object()
wsgi_request.__dict__['inner_property'] = inner_sentinel
request = Request(wsgi_request)
outer_sentinel = object()
request.__dict__['inner_property'] = outer_sentinel
assert request.inner_property is outer_sentinel