mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-08-04 20:40:14 +03:00
Use getattr for better performance
__getattribute__ is called everytime any attribute is accessed on request. It catches AttributeErrors in order to proxy to the underlying request. getattr is called, by python, whenever an attribute is missing and has a much lower overhead.
This commit is contained in:
parent
85e57afc20
commit
eb3208c87c
|
@ -346,11 +346,24 @@ class Request(object):
|
|||
else:
|
||||
self.auth = None
|
||||
|
||||
def __getattribute__(self, attr):
|
||||
def __getattr__(self, attr):
|
||||
"""
|
||||
If an attribute does not exist on this instance, then we also attempt
|
||||
to proxy it to the underlying HttpRequest object.
|
||||
"""
|
||||
try:
|
||||
return getattr(self._request, attr)
|
||||
except AttributeError:
|
||||
# Call the original implementation of getattribute
|
||||
# So the correct attribute error will get raised
|
||||
self.__getattr_trace__(attr)
|
||||
|
||||
def __getattr_trace__(self, attr):
|
||||
"""
|
||||
The original implementation of __getattribute__ which
|
||||
generates correct tracebacks
|
||||
See #2108 and #2530
|
||||
"""
|
||||
try:
|
||||
return super(Request, self).__getattribute__(attr)
|
||||
except AttributeError:
|
||||
|
|
Loading…
Reference in New Issue
Block a user