一、Request
在Rest Framework 传入视图的request对象已经不再是Django默认的HTTPResponse对象了,而是Rest Framework提供的Request类的对象了。
但是Request会在接受到请求后会自动根据Content-type
的数据类型进行解析为[QueryDict]对象,也就是说它会自动根据前端发送的数据格式进行解析。
源码分析
# from rest_framework.request import Request
def __init__(self, request, parsers=None, authenticators=None,
negotiator=None, parser_context=None):
# 先判断传入的request是不是原生的HttpResponse的对象,为了避免套娃
assert isinstance(request, HttpRequest), (
.format(request.__class__.__module__, request.__class__.__name__)
)
# 二次封装request,将原生request作为drf request对象的 _request 属性
self._request = request
# 点拦截,当新request.的时候触发
def __getattr__(self, attr):
try:
return getattr(self._request, attr) # 通过反射,获取原生request对象,取出属性或方法
except AttributeError:
return self.__getattribute__(attr)
常用属性
request.data:
返回解析后的请求体数据,不仅支持表单类型数据,也支持JSON数据
request.query_params:
和Django原生的request.GET
相同,名字不一样而已
@property
def query_params(self):
return self._request.GET # 还是原来那个
二、Response
这是Rest Framework提供的响应类,它会把数据内容转换成符合前端的数据类型,它是根据请求头中的Accept
来自动转换响应数据到对应格式。没有的话就是默认的,可以通过以下配置:
REST_FRAMEWORK = {
‘DEFAULT_RENDERER_CLASSES‘: ( # 默认响应渲染类
‘rest_framework.renderers.JSONRenderer‘, # json渲染器
‘rest_framework.renderers.BrowsableAPIRenderer‘, # 浏览API渲染器
)
}
参数说明
# from rest_framework.response import Response
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
data:
返回要被序列化的数据,字典
status:
状态码,默认200
template:
模板名称,可以自定义模版
headers:
响应头,可以往响应头放东西,就是一个字典
content_type:
响应的编码格式,(application/json或text/html)
常用属性
.data:
传给response对象序列化后没有render的数据
.status_code:
状态码
.content:
render后的响应数据