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 全局异常