自学内容网 自学内容网

DRF 请求与响应

请求与响应

【1】Request对象

(1)常用属性

  • request._request
    • request之前的所有属性和方法,是被完美继承的,老的东西任然可以使用
    • 就是老的request
  • request.data
    • 将请求体中的数据(无论是什么方法,还是什么格式的数据)都将放在一个字典中
  • request.query_params
    • 将访问请求的查询参数分装在这个属性中,方便提取URL参数,贴合restful规范

(2)限制请求数据编码格式

  • 我们常用的编码格式
    • urlencodedform-datajson
  • 但是如果我们想要限制前端发送的请求格式(比如只让发送Json等),有三种方法
  • 方法一:中间件
    • 依据:在每次发送请求进入视图函数之前都会进行中间件的判断,所以这个方法可行
class InfoMiddleWare(MiddlewareMixin):
    def process_request(self, request):
        content_type = request.META.get("CONTENT_TYPE")
        print(content_type)  # application/json
        if 'json' not in content_type:
            return JsonResponse({"error": "只能接收json格式"}, status=400)

  • 小补充:

    • 如何找到那些REST_FRAMEWORK的默认配置
    • from rest_framework import settings
    • 进入rest_framework的settings文件就可以看到
  • 方法二:全局配置

    • rest_framework提供了配置,可以直接将所有的请求编码格式添加要求
# settings.py文件中
REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
    ],
}
  • 方法三:局部配置
    • 如果想要限制某个视图类的请求编码格式,那么在这个视图类中添加类变量parser_classes
    • 如果同时配置了全局配置和局部配置,那么会生效局部的,按照就近原则,就近的会进行属性重写
from rest_framework.parsers import JSONParser, DjangoMultiPartParser, FormParser
# 只能传递json编码格式
class AuthorAPIView(APIView):
    parser_classes = [JSONParser]
  • 他们之间的对应关系
    • JSONParser ----- application/json
    • DjangoMultiPartParser ----- multipart/form-data
    • FormParser ----- application/x-www-form-urlencoded

(3)限制请求方法

  • 方法一:中间件
    • request.method中可以拿到当前请求的请求方法,根据这个判断就可以
  • 方法二:根据源码来
    • 在源码分析中dispach方法会进行一个判断if request.method.lower() in self.http_method_names:
    • 其中有这么个属性http_method_names,里面放的时允许的请求方式
    • 所以在视图类中重写这个属性就可以限制访问的方法
class AuthorAPIView(APIView):
    # 只允许发送get请求
    http_method_names = [’get']

【2】Response对象

(1)简介

  • DRF的Response类是专门为构建RESTful API设计的,它不仅仅是一个简单的JSON响应,而是包含了一系列与RESTful API交互有关的功能。
    • 内容类型协商:DRF的Response类能够自动处理内容类型协商,根据客户端的请求头(如Accept)来返回适当的媒体类型。
    • 渲染器:DRF提供了多种渲染器,可以将响应数据渲染为不同的格式(如JSON、XML等)。Response类会根据请求的内容类型选择适当的渲染器。
    • 状态码:DRF的Response类可以轻松设置HTTP状态码,以表示API请求的成功或失败。
    • 头信息:可以使用Response类来设置HTTP响应的头信息。
    • 数据序列化:DRF的序列化器与Response类紧密集成,使得从数据库模型到JSON响应的转换变得简单。

(2)参数

  • data
    • 这个参数是响应体中要包含的数据。它可以是任何可以被序列化为JSON的对象(例如字典、列表、模型实例等)
  • status
    • 这个参数指定了HTTP响应的状态码。它应该是一个有效的HTTP状态码,如 200(成功)、404(未找到)或 500(服务器内部错误),还可以使用它提供的状态码常量,如 status.HTTP_200_OK
  • template_name
    • 这个参数在Django REST framework中不常用,但在标准的Django视图中,它用于指定要渲染的模板的名称
  • headers
    • 这个参数允许你设置自定义的HTTP响应头。它是一个字典,其中键是头字段的名称,值是头字段的值
  • exception
    • 这个参数通常不直接由开发者设置。
  • content_type
    • 这个参数用于指定响应的 Content-Type。虽然通常可以通过设置 headers 参数中的 Content-Type 来达到同样的效果,但 content_type 参数提供了一种更直接的方式来设置它

(3)执行响应格式

  • 方式一:全局配置
# settings配置文件
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.TemplateHTMLRenderer',
    ],
}
  • 方式二:局部配置
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer

# BrowsableAPIRenderer
# 返回浏览器页面格式,postman将无法正常显示
class AuthorAPIView(APIView):
    renderer_classes = [BrowsableAPIRenderer]


原文地址:https://blog.csdn.net/weixin_48183870/article/details/137980960

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!