DRF-源码解析-1.1-drf的request对象:drf的request对象有何不同,drf的request多了哪些功能,drf的request比django的request好在哪里

DRF的request对象,不是原生Django的request对象了,是新创建的。

一、介绍两个魔法方法

  • __getattr__

    • 当对象.成员,不存在时,就会触发__getattr__ 方法
      
  • __getattribute__

    • 当对象.成员,(无论成员是否存在),都会触发__getattribute__方法
      

二、源码解析request对象创建

1、在视图执行过程中,drf的Request的对象实例化

def initialize_request(self, request, *args, **kwargs):
       #解析器
       parser_context = self.get_parser_context(request)
 		
       #返回drf的Request的实例对象
       return Request(
           request,#原生django的request对象
           parsers=self.get_parsers(), 
           authenticators=self.get_authenticators(),#[认证对象1,...]
           negotiator=self.get_content_negotiator(),
           parser_context=parser_context
       )

2、Request:简化的源码

from rest_framework.request import Request

class Request:
	@property
    def data(self):
        #获取请求体中的数据:不管是form-data 还是json,都统一在data中获取数据
        if not _hasattr(self, '_full_data'):
            self._load_data_and_files()
        return self._full_data
    def __getattr__(self, attr):
        # self._request 是原生django的request对象
        # 当drf的request.GET,drf的requets没有,就去原生django的request中调用
        try:
            return getattr(self._request, attr)
        except AttributeError:
            return self.__getattribute__(attr)
	@property
    def FILES(self):
        #获取文件数据
        if not _hasattr(self, '_files'):
            self._load_data_and_files()
        return self._files
	@property
    def query_params(self):
        #获取查询字符串数据
        return self._request.GET
  • drf的request设计的妙处
    • 解决了原生django只能处理urlencode 类型的数据,即表单类型的数据,无法原始的json格式数据
    • 实现__getattr__魔法方法:当drf的request中没有的成员,就去django的request中获取
      • request.GET, 在drf的request中没有实现该方法,就触发魔法方法,去django的request中获取GET方法了
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值