Loading

DRF之请求与响应

一、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后的响应数据

posted @ 2021-07-05 20:15  Mr-Yang`  阅读(83)  评论(0编辑  收藏  举报