DRF之APIView源码分析

url.py
	path('books/', BookView.as_view())
view.py
	class BookView(APIView):
        pass

1.我们看自己是否有as_view()方法,没有,那我们就来到继承的APIView类中
view = super().as_view(**initkwargs)  # 这是调用了父类View的as_View方法

return csrf_exempt(view)  # 只要是继承了APIView类的视图函数都失去csrf的保护

在View中的dispatch方法的时候,我们需要先看APIView类中有没有该方法,来到APIView中的dispatch方法:

	request = self.initialize_request(request, *args, **kwargs)  # 创建了一个新的request,后面使用的不再是Django中的request方法了
    self.request = request  # 更换掉request方法
    
    try:
        self.initial(request, *args, **kwargs)

        # Get the appropriate handler method(获取到适当的处理程序方法)
        if request.method.lower() in self.http_method_names:
            handler = getattr(self, request.method.lower(),  # 这里判断是否存在于7大方法中,eg:get
                              self.http_method_not_allowed)
        else:
            handler = self.http_method_not_allowed

            response = handler(request, *args, **kwargs)  # 返回request=get(request,*args,**kwargs)

   except Exception as exc:
           response = self.handle_exception(exc)

   self.response = self.finalize_response(request, response, *args, **kwargs)
   return self.response
    
     
APIView类
    1.包装新的request
    2.执行了认证,权限,频率
    3.处理了全局异常
    4.包装了request对象
drf是一个第三方的app,只能在django中使用
安装好drf之后,需要导入APIView视图类,后期使用drf写视图类,都是继承了APIView视图类或其子类


当我们使用request.data的时候,三种数据格式的结果方式是

1.urldecoded和form_data的结果是QueryDict形式
2.Json的结果是字典


使用View和JsonResponse写
继承的是View


当我们使用APIView+drf的Response写的时候,我们不要忘记注册rest_framework这个app
继承APIView视图类,可以使用request.data
原生的request.POST中,只有urlencoded和form-data格式提交的数据可以获取到,json格式提交的数据在body中,需要我们自己处理;但是在drf中,request中有一个data,data中可以取到任意的编码提交的数据


request._request.GET -最初始的request。  # 相当于是request.GET
request._request -新request
那么为什么新的request可以与老request执行结果相同。
因为触发了__getattr__魔法方法,何为魔法方法?不需要主动调用,某种状态下会触发。
__getattr__ 对象.属性 会触发并执行

def __getattr__(self, attr):
    try:
        return getattr(self._request, attr)
    except
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值