drf在哪里改变了request
drf
重写dispatch
改变了request
def dispatch(self, request, *args, **kwargs):
...
# 现在的request 还是django原生request
request = self.initialize_request(request, *args, **kwargs)
# 在这 request 变成了 drf 的 request
...
initialize_request
初始化了一个drf
的request
。最终使用Request
来对django request
进行封装。
def initialize_request(self, request, *args, **kwargs):
"""
Returns the initial request object.
"""
parser_context = self.get_parser_context(request)
return Request(
request,
parsers=self.get_parsers(),
authenticators=self.get_authenticators(),
negotiator=self.get_content_negotiator(),
parser_context=parser_context
)
封装了哪些内容
将django request
封装到了 self._request
中。重新实现了query_params
、data
等方法。
class Request:
def __init__(self, request, parsers=None, authenticators=None,
negotiator=None, parser_context=None):
...
self._request = request
...
@property
def query_params(self):
"""
More semantically correct name for request.GET.
"""
return self._request.GET
@property
def data(self):
if not _hasattr(self, '_full_data'):
self._load_data_and_files()
return self._full_data
除了封装新方法外还使用__getattr__
实现了对django request
原生方法的全面兼容
class Request:
...
def __getattr__(self, attr):
"""
当属性不存在时调用该方法
在此处就是实现了原生django的方法代理
"""
try:
return getattr(self._request, attr)
except AttributeError:
return self.__getattribute__(attr)
...