Request对象源码分析

发布时间 2023-12-20 15:28:14作者: wellplayed

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
        ...