使用drf就继承APIView类,APIview也是drf最上层的类,(drf提供了很多类,他们都继承自APIView类)。
继承APIview这个类,返回Response对象。(和cbv差不多,只是继承的和返回的不一样)
路由和cbv写法一样。
1、APIview的源码。
--APIview类继承了django的view。
--重写了as_view方法,又调用了父类的as_view方法。
--视图不需要csrf认证了,不管是否注释掉中间件,它取消了。
--drf提供了一个Request对象,它把老的赋值给了Request的一个属性。self._request = request
--Request对象有个属性.data
--request.data的数据是从request.body中取出来的,再loads反序列化,只要是POST请求方式都从request.data中取。
@classmethod
def as_view(cls, **initkwargs):
# 调用父类的as_view
view = super().as_view(**initkwargs)
# 只要继承APIView以后所有的视图都没有csrf保护了,不管是否注释掉中间件.
return csrf_exempt(view) # 取消认证
2 再执行self.dispatch()---->APIView的dispatch def dispatch(self, request, *args, **kwargs):
# 包装了一个新的request对象,基于原来的request对象包装的。
# 这个request对象是新的request对象,是drf提供的Request类的对象
request = self.initialize_request(request, *args, **kwargs)
(django的request)赋值给了Request对象的属性_request
self._request = request
3 在视图类中使用的Request对象是导入过来的,新的request.GET拿到的还是老的GET,原理如下(Request类重写了__getattr__)
对象.属性就会执行__getattr__(魔法方法、内置方法)
def __getattr__(self, attr):
try:
return getattr(self._request, attr)
except AttributeError:
return self.__getattribute__(attr)
4 结论:以后继承了APIView后,request对象成了新的,但是跟原来一样用。
5 新的request对象中有一个属性data request.data是request.POST请求携带的数据----》字典,取决于前端发来的数据类型?
# 大写的request.POST里没有值,因为前端传来的是JSON格式,JSON传来的数据都在request.body里。
# request.data的数据是从request.body中取出来的,再loads反序列化,只要是POST请求方式都从request.data中取。