diff options
| author | Tom Christie | 2015-02-09 17:56:25 +0000 | 
|---|---|---|
| committer | Tom Christie | 2015-02-09 17:56:25 +0000 | 
| commit | 873fb69395de6fd230e4aba1b707c1f1979c0f07 (patch) | |
| tree | 3ba0bdc1bbb21fcb7e36c37cd6170112c94a7054 /rest_framework/request.py | |
| parent | 235b98e427e2bae2b52fb386a42c8045724de251 (diff) | |
| parent | 1a087c8c5bac6f157979ef9ff540c0eb23848fb4 (diff) | |
| download | django-rest-framework-873fb69395de6fd230e4aba1b707c1f1979c0f07.tar.bz2 | |
Merge pull request #2530 from tomchristie/attribute-proxying-fix
Fix misleading `AttributeError` tracebacks on `Request` objects.
Diffstat (limited to 'rest_framework/request.py')
| -rw-r--r-- | rest_framework/request.py | 21 | 
1 files changed, 15 insertions, 6 deletions
| diff --git a/rest_framework/request.py b/rest_framework/request.py index cfbbdecc..c4de9424 100644 --- a/rest_framework/request.py +++ b/rest_framework/request.py @@ -12,12 +12,13 @@ from __future__ import unicode_literals  from django.conf import settings  from django.http import QueryDict  from django.http.multipartparser import parse_header +from django.utils import six  from django.utils.datastructures import MultiValueDict  from django.utils.datastructures import MergeDict as DjangoMergeDict -from django.utils.six import BytesIO  from rest_framework import HTTP_HEADER_ENCODING  from rest_framework import exceptions  from rest_framework.settings import api_settings +import sys  import warnings @@ -362,7 +363,7 @@ class Request(object):          elif hasattr(self._request, 'read'):              self._stream = self._request          else: -            self._stream = BytesIO(self.raw_post_data) +            self._stream = six.BytesIO(self.raw_post_data)      def _perform_form_overloading(self):          """ @@ -404,7 +405,7 @@ class Request(object):              self._CONTENTTYPE_PARAM in self._data          ):              self._content_type = self._data[self._CONTENTTYPE_PARAM] -            self._stream = BytesIO(self._data[self._CONTENT_PARAM].encode(self.parser_context['encoding'])) +            self._stream = six.BytesIO(self._data[self._CONTENT_PARAM].encode(self.parser_context['encoding']))              self._data, self._files, self._full_data = (Empty, Empty, Empty)      def _parse(self): @@ -485,8 +486,16 @@ class Request(object):          else:              self.auth = None -    def __getattr__(self, attr): +    def __getattribute__(self, attr):          """ -        Proxy other attributes to the underlying HttpRequest object. +        If an attribute does not exist on this instance, then we also attempt +        to proxy it to the underlying HttpRequest object.          """ -        return getattr(self._request, attr) +        try: +            return super(Request, self).__getattribute__(attr) +        except AttributeError: +            info = sys.exc_info() +            try: +                return getattr(self._request, attr) +            except AttributeError: +                six.reraise(info[0], info[1], info[2].tb_next) | 
