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'}
'''
浙公网安备 33010602011771号