drf之请求request与response

发布时间 2023-04-24 11:23:47作者: 树苗叶子

Request可解析编码格式

request可以解析三种由前端传入的编码格式:JSONParser,FormParser,MultiPartParser
当有需要,只接收用户传入的文件,而不接收其它数据的时候,就可以定制传入的格式

  • drf的配置文件中默认就指定的可接收的三种格式的配置,如下:
DEFAULTS = {
   ...
   ...
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser'
    ],
   ...
   ...

定制传入数据类型格式

方法一,使用parser_classes定制

此方法只是针对一个类,比较有针对性,且优先级最高

class TestView(APIView):
    # 需要导入三种数据格式
    from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
    # 定义一个列表,列表中的内容为可以使用数据格式,这里只允许JSON格式数据
    parser_classes = [JSONParser,]
    def post(self, request):
        print(request.data)
        print(type(request.data))
        return Response({'code': 'success'})

如图,可以看到导入的格式为非指定格式会报错

方法二,使用settings.py配置

此方法为全局配置,优先级低于在类中配置parser_classes方法

在rest_framework的settings.py中的最顶部可以看到一个注释,大概就是说明如果想在自己的项目中使用配置的话,需要在自己项目的settings.py中添加下面的内容

settings.py中配置

REST_FRAMEWORK = {
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',       # 我只配置了JSON解析,所以前端在传入其他数据格式时,会报错。
        # 'rest_framework.parsers.FormParser',
        # 'rest_framework.parsers.MultiPartParser',
    ],
}

优先级说明

  1. 类中的parser_classes
  2. settings.py中的配置
  3. REST_FRAMEWORK中的settings.py中的配置
    以上三个的优先级为 1 > 2 > 3
    也就是,当在类中定义了parser_classes,在settings.py中也定义了REST_FRAMEWORK配置,那么,系统会走parser_classes,不会再走settings.py中的配置了。

Response

Response有两种返回方法,JSONRenderer和TemplateHTMLRenderer
优先级高

INSTALLED_APPS = [
    ...
    'rest_framework'
]

方法一,在类中定义Response返回格式

class TestView(APIView):
    # 导入相关包
    from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
    # 定义返回的数据格式
    renderer_classes = [JSONRenderer, ]

    def get(self, request):
        return Response({'code': 'success'})

方法二,在settings.py中定义返回格式

在rest_framework的settings.py中的最顶部可以看到一个注释,大概就是说明如果想在自己的项目中使用配置的话,需要在自己项目的settings.py中添加相关配置
优先级低

REST_FRAMEWORK = {
    ...
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.TemplateHTMLRenderer',
}

优先级说明

  1. 类中的renderer_classes
  2. settings.py中的配置
  3. REST_FRAMEWORK中的settings.py中的配置
    以上三个的优先级为 1 > 2 > 3
    也就是,当在类中定义了renderer_classes,在settings.py中也定义了REST_FRAMEWORK配置,那么,系统会走renderer_classes,不会再走settings.py中的配置了。

Response init可以传入的参数

def __init__(self,
    data=None,
    status=None,
    template_name=None,
    headers=None,
    exception=False,
    content_type=None)
  • data

    • data中的内容可以是“字典,列表,字符串”三种格式,会把序列化后的内容返回给前端。
  • status

    • http的响应状态码,默认是200,可以通过下面方法修改
    • drf已将所有的http响应状态码全部重写,并且所有的响应状态码是常量
from rest_framework import status
return Response({'code': 'success'}, status=status.HTTP_200_OK)
  • template_name

    • 可以修改响应模版的样式,一般用不到
  • headers响应头

    • 原生django在响应头中添加定制化内容:
# 四件套 render,redirect,HttpResponse,JsonResponse
obj = HttpResponse('dddd')
obj['定制响应头的键'] = '定制响应头的值'
return obj
- drj定制响应头
return Response({'code': 'success'}, headers={'定制响应头的键':'定制响应头的值'})
  • content_type 响应编码格式,一般不动