drf中的 APIView分析

 APIView仍然继承了django中的View类的方法外,比之前继承django的View多了如下:
    -0 去除了csrf认证
    -1 包装了新的request
    -2 执行了认证,频率,权限 这三大认证
    -3 全局异常处理:在视图类的方法中执行报错,会被异常捕获,做统一处理

 2.在 APIView中可以看到,依旧有as_view方法,可以看到,最后return csrf_exemp(view)相当于

去除了csrf认证,即在视图函数上加 装饰器csrf_exempt。

ps: 装饰器的本质就是 被装饰的函数=装饰器(被装饰的函数)

view = super().as_view(**initkwargs)  #子类继承父类

然后此时的view就是父类View中的view

然后在View中的as_view方法中看到此时定义的函数view中最后return 到了dispatch方法,

3.(1)在APIView中看是否有dispatch方法,若有则执行APIView中的dispatch方法,若没有则执行的是其父类的dispatch方法。

(2)在APIView中找到dispatch方法

(3)查看该方法,request = self.initialize_request(request,*args,**kwargs)

包装了新的request对象

(4)由于在View中已经将类实例化得到对象

 def view(request, *args, **kwargs):
        self = cls(**initkwargs) # 类实例化得到对象

所以此时的self.request 是新的对象

把新的request,赋值给了 self.request

即就是在视图函数中继承APIView的那个类的对象

4.(1)在该dispatch方法中执行了三大认证。

        self.perform_authentication(request)
        self.check_permissions(request)
        self.check_throttles(request)

 跟之前View的dispath是一样的---根据请求方式执行类中同名方法
本质是执行视图类的方法

(2)在try里面,若出现异常会被捕获,全局异常处理

 新的request不在用POAT和body接受参数,而是统一的用request.data

class PublishView(APIView):
    def get(self, request):
        print(type(request))  #继承APIView的类型为<class 'rest_framework.request.Request'>

        print(type(request._request))  #继承View的类型为<class 'django.core.handlers.wsgi.WSGIRequest'>

        #新的和老的用起来一样,多了之前写装饰器时可以打印的request.data中的内容,此时再用request.data不会报错

        print(request.data)  #此时无装饰器依旧可以获得前端的数据<QueryDict: {'name': ['qq'], 'pwd': ['123']}>,无论什么格式的数据都可以获得到get方式也可以】
        #如果是urlencode ,QueryDict就是原来的request.POST打印出来的数据,若是json格式则是普通字典。


        #若用get方式时,URL后面连接的参数用request.GET取值(此时取的值是列表的形式,GET取值是去最后一个,GETLIST可以取出列表),在新的request中,用request.query_params取值二者是一样的。
        return JsonResponse({"code":999})

 总结:
    视图类继承APIView后多了
        -0 去除了csrf认证
        -1 新的request
            -request.data
            -request.query_params
            -request.其他跟之前一样
            -request._request  是老的
        -2 三大认证
        -3 全局异常

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值