Loading

请求与响应

【一】请求 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',
    ],
posted @ 2024-04-21 21:44  HuangQiaoqi  阅读(9)  评论(0编辑  收藏  举报