Request里面有_authenticate方法,user,auth,data这几个方法被装饰成了属性,当取前两个属性的值的时候,如果有这个属性,就直接返回它的值 self._user self._auth,如果没有这个属性,就调用_authenticate方法,源码参见:
https://www.cnblogs.com/landson/p/15674728.html

from rest_framework.request import Request
# 继承了APIView的视图类(自定义的CBV)中的request都不是django原生的request了,原生的request在新的request._request中
# 新的request用法和原生的request是一样的,因为Request类重写了__getattr__方法
def __getattr__(self, attr):
    """
        If an attribute does not exist on this instance, then we also attempt
        to proxy it to the underlying HttpRequest object.
        """
    try:
        return getattr(self._request, attr)
    except AttributeError:
        return self.__getattribute__(attr)
    

request.data #其实是个方法,被@property装饰成了属性,它的返回值是一个字典,post请求不管使用三种编码方式中的哪一种,传过来的数据,都在request.data 里面


# get请求携带的数据可以通过以下方式获取
print(request.GET)
print(request.query_params)
# Request类中的query_params方法
@property
def query_params(self):
    """
        More semantically correct name for request.GET.
        """
    return self._request.GET

自己封装Response对象

定制返回的内容

# 正常要写在utils文件夹中
from rest_framework.response import Response
class MyResponse(Response):
    def __init__(self,code=100,msg='成功',data=None,status=None,headers=None,**kwargs):
        dic={'code':code,'msg':msg}
        if data:
            dic['data']=data
        dic.update(kwargs)
        super().__init__(data=dic,status=status,headers=headers)
        
from app01.my_auth import MyResponse
class BooksView(APIView):
    def get(self,request):
        books=Book.objects.all()
        books_ser=BookSerializer(books,many=True)
        return MyResponse(data=books_ser.data,token='xxxx')
class Response(SimpleTemplateResponse):
	...	
	def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
        '''
        之前用的时候,只给data参数传了值
        template_name 在用浏览器做测试的时候,返回的html页面,支持自定义,一般不会去改它
        content_type是返回的编码格式,content_type='application/json
        响应头:可以往里面放东西,headers={'token':'xxx'}
        '''