请求与响应
【一】请求 Request
首先要知道,继承了APIView的视图类的方法的request对象不在是django默认的request对象,而是经过drf包装的一个新的request对象,他比老的request的功能要强大,它是Request类的对象
如果想要限制前端发过来的数据格式,它也可以控制解析的格式
views.py
class RequestView(APIView):
# 限制请求,只接收json格式
# 方式一 :在视图类中控制,先导入JSONParser, FormParser, MultiPartParser三个类风别时控制可以接收的请求格式
parser_classes = [JSONParser]
# 方式二 在配置文件中配置 REST_FRAMEWORK,配置文件配置的是全局配置,如果全局和局部(方式一)都配置了,那么以局部为准,局部优先
def post(self, request):
print(request.data) # 通过formdata发请求 request.data里面也有文件数据
print(request.FILES) # 这里面也有文件数据
return Response('post ok')
settings.py
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser',
],
}
补充
新的request.data既可以拿到文件数据,也可以拿到普通数据
【二】响应 Response
【1】响应对象
drf给我们提供了一个响应类Response,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。
【2】响应对象参数分析
点进源码来看会发现有这么一堆参数
class Response(SimpleTemplateResponse):
def __init__(self, data=None,
status=None,
template_name=None,
headers=None,
exception=False,
content_type=None):
data: # 字典,列表,字符串。。--》后续放在了响应体中
status # http响应状态码,如果不传,默认是200 ,status包下定义了一堆http状态码常量
template_name: # 一般不用,用浏览器方法--可以看到的样子
headers: # 响应头,可以根据需求自己在响应头上加点东西
exception:# 不用管
content_type: # 指定响应编码格式,一般默认
补充
有时候前端带来sessionid到后端,但是后端没有session表(也就是还没有做表迁移的时候),就会报错。
【3】响应格式
drf接口会根据客户端类型自动返回不同的格式,比如浏览器就返回好看的html页面,postman就返回一堆json数据
跟解析请求数据一样,也可以做限制处理
# 先导入这两个类 JSONRenderer就是JSON格式 BrowsableAPIRenderer就是浏览器格式,也就是html页面
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
class RequestView(APIView):
# 控制响应格式
# 方法一 再类中写renderer_classes属性
renderer_classes = [JSONRenderer] # 只响应JSON格式 无论是浏览器还是postman
def post(self, request):
print(request.data) # 通过formdata发请求 request.data里面也有文件数据
print(request.FILES) # 这里面也有文件数据
return Response('post ok')
def get(self, request):
return Response()
# 方法二 全局控制 在settings文件中配置
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.TemplateHTMLRenderer',
],