Request对象源码分析
1.分析APIVIew时,我们可以了解——以后的request都是drf提供的Request的对象了
from rest_framework.request import Request
2.源码分析
生成新request的部分源码:
# 先看 __init__:类实例化得到对象时,对对象进行初始化,往对象中放数据 def __init__(self, request, parsers=None, authenticators=None,negotiator=None, parser_context=None): # 传入的request是老的,django原生的request # 放到了self._request,self 是新的request类的对象 self._request = request self._data = Empty self._files = Empty # 此后的request都是新的request了 request = self.initialize_request(request, *args, **kwargs) return Request(request)
调用方法和原来request对象一致的原因:
# 新的requet.method调用的时候,如果method不存在就会触发Request类的 __getattr__方法 def __getattr__(self, attr): try: # 通过反射,去老的中取,能取到就返回,取不到,执行except代码,再取不到就报错 return getattr(self._request, attr) except AttributeError: return self.__getattribute__(attr)
总结:
-1 新的request中有老的requet, 在request._request -2 新的request 多了data属性,客户端提交的请求体中得数据,无论以那种方式编码,都在request.data中,可以通过request.data调用 -3 其他的使用,跟之前老request一模一样 request.method request.path request.POST request.GET request.FILES ...