DRF的Request对象和Response对象

2021-12-16 13:13:20 浏览数 (1)

DRF的Request对象和Response对象

一旦使用了DRF的视图,那么传入视图的Request对象不在是Django的Request对象,而是DRF封装过后的Request对象。同样,DRF建议使用封装过的Response来返回HTTP响应,使用该类构造响应对象时,响应的具体数据内容会被转换(render渲染)成符合前端需求的类型。

Request对象

REST framework 的Request类扩展了标准HttpRequest,增加了对 REST framework 灵活的请求解析和请求身份验证的支持。由于实现原因,Request类不是从HttpRequest类继承,而是使用组合扩展该类。 因此,HttpRequest类的方法和属性依旧是可以使用的。

Request.data

Request对象的数据是自动根据前端发送数据的格式进行解析之后的结果。这样后端使用统一的方式来获取数据,无论前端传递的是表单,json还是其它格式。后端使用统一的方式接受数据即可。

代码语言:javascript复制
@api_view(['POST'])
def post(request):
    data = request.data     # 获取请求体数据
    return Response(data)

包含了对POST、PUT、PATCH请求方式解析后的数据; 利用了REST framework的parsers解析器,不仅支持表单类型数据,也支持JSON数据。

如果需要上传文件,请阅读DRF上传文件

注意

代码语言:javascript复制
在开发客户端应用程序时,请始终记住确保Content-Type在 HTTP 请求中发送数据时设置标头。

如果您不设置内容类型,大多数客户端将默认使用'application/x-www-form-urlencoded',这可能不是您想要的。

例如,如果您json使用带有.ajax() 方法的jQuery发送编码数据,则应确保包含该contentType: 'application/json'设置。

如果服务器和客户端之间约定好了使用json来传递信息,此时可以对默认解析器进行设置,在settings.py中加入下面的内容即可。

代码语言:javascript复制
REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
    ]
}

也可以使用基于APIView类的视图设置用于单个视图或视图集的解析器。例如:

代码语言:javascript复制
# 视图集
from rest_framework.parsers import JSONParser
from rest_framework.response import Response
from rest_framework.views import APIView

class ExampleView(APIView):
    """
    A view that can accept POST requests with JSON content.
    """
    parser_classes = [JSONParser]

    def post(self, request, format=None):
        return Response({'received data': request.data})

# 单个视图
from rest_framework.decorators import api_view
from rest_framework.decorators import parser_classes
from rest_framework.parsers import JSONParser

@api_view(['POST'])
@parser_classes([JSONParser])
def example_view(request, format=None):
    """
    A view that can accept POST requests with JSON content.
    """
    return Response({'received data': request.data})

Request.query_params

request.query_params与Django标准的request.GET相同,只是更换了更正确的名称而已。 无论请求方式是什么,URL中的参数,我们在DRF中总是使用request.query_params来获取。例如:

代码语言:javascript复制
@api_view(['GET'])
def geta(request):
    data = request.query_params
    print(data)

    return Response(data)

我们发起的请求可以如下所示:

http://127.0.0.1:8888/people?username=123&email=123@123.com

返回的结果如下:

代码语言:javascript复制
{
    "username": "123",
    "email": "123@123.com"
}

Response对象

REST Framework的Response继承自Django的SimpleTemplateResponse类。使用Response类只是为返回内容协商的 Web API 响应提供了一个更好的接口,可以呈现为多种格式。你也可以选择Django的HttpResponse或StreamingHttpResponse,都是可以的。不过DRF官方还是建议我们对继承自APIView类或使用@api_view进行装饰的函数,都返回Response对象。

使用了Response对象返回,默认会带有一定的样式。例如:

参考资料: https://www.django-rest-framework.org/api-guide/requests/ https://www.django-rest-framework.org/api-guide/responses/

0 人点赞