栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

DRF的Request对象和Response对象

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

DRF的Request对象和Response对象

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还是其它格式。后端使用统一的方式接受数据即可。

@api_view(['POST'])
def post(request):
    data = request.data     # 获取请求体数据
    return Response(data)

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

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

注意

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

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

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

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

REST_frameWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
    ]
}

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

# 视图集
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来获取。例如:

@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

返回的结果如下:

{
    "username": "123",
    "email": "123@123.com"
}
Response对象

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

  • 构造方式

    Response(data, status=None, template_name=None, headers=None, content_type=None)

      data:响应的序列化数据,只能是python内置数据类型,否则需要先序列化,在传递。
      status:响应的状态代码。默认为 200。
      template_name:HTMLRenderer选择时使用的模板名称。
      headers:在响应中使用的 HTTP 标头字典。
      content_type:响应的内容类型。通常,这将由内容协商确定的渲染器自动设置,但在某些情况下,您可能需要明确指定内容类型。
    

    我们依旧可以使用下面的方式在DRF中设置响应头:

    response = Response()
    response['Cache-Control'] = 'no-cache'
    

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

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/664822.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号