DRF框架请求与响应

x33g5p2x  于2022-04-01 转载在 其他  
字(3.4k)|赞(0)|评价(0)|浏览(351)


DRF 中Request对象和Response对象的常用方法和参数,如何局部/全局配置解析格式都在这里👆

DRF框架请求与响应

DRF 之Request

Request是包装后的request,前面源码分析过了

不会DRF?源码都分析透了确定不来看? - HammerZe - 博客园 (cnblogs.com)

前面的文章介绍到,新包装的Request对象和原来django的request对象没有什么区别,使用方法一样,只是多了request.data,当然区别也不止这一点,我们看一下目录

request常用方法

  • 新包装的Request对象是通过__getattr__方法反射过来的
def __getattr__(self, attr):
        try:
            return getattr(self._request, attr)
        except AttributeError:
            return self.__getattribute__(attr)
  • 现在数据都可以通过request.data获取
@property
    def data(self):
        if not _hasattr(self, '_full_data'):
            self._load_data_and_files()
        return self._full_data
  • 原来request请求提交的数据在GET里,现在请求参数可以通过request.query_parmas来查询参数,也是被伪装成数据属性了,本质还是使用了原来request对象的GET,所以请求参数既可以从GET中取,也可以从request.query_params中取
@property
    def query_params(self):
        """
        More semantically correct name for request.GET.
        """
        return self._request.GET

配置请求数据格式

默认的情况下,三种数据格式(urlencoded,formdata,json)都可以解析

比如当请求(post)过来要新增一条数据,那么我们可以针对该请求的数据格式做要求,比如只能提交json格式,或者允许From-data和json等···通过写接口实现,需要进行局部(views)或者全局配置(settings)

配置处理顺序

  1. 局部优先
  2. 全局其次
  3. 默认配置最后

局部配置

  • 导入:from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
  • 配置参数:parser_classes
    配置在视图类里
'''views.py'''
# 作者详情视图类
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
class AuthorDetailView(APIView):

# 只处理json格式,默认三种格式都可以
    # parser_classes = [JSONParser, FormParser, MultiPartParser]
    parser_classes = [JSONParser]
    def post(self, request):
        # 获取反序列化数据
        ser = serializer.AuthorDetailSerializer(data=request.data)
        if ser.is_valid():
            # 校验通过存入数据库,不需要重写create方法了
            ser.save()
            return Response({'code': 100, 'msg': '新增成功', 'data': ser.data})
        # 校验失败
        return Response({'code': 101, 'msg': '校验未通过', 'error': ser.errors})

注意

在局部配置的时候千万注意,如果parser_classes=[],那么什么数据格式都不解析

全局配置

导入from rest_framework import settings
源码解释

'''Settings for REST framework are all namespaced in the REST_FRAMEWORK setting.
For example your project's `settings.py` file might look like this:

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.TemplateHTMLRenderer',
    ],
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
    ],
}
'''

全局settings.py配置

from rest_framework import settings

REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
        'rest_framework.parsers.FormParser',
        'rest_framework.parsers.MultiPartParser',
    ],
}

'''默认是三种数据格式都解析的,想解析哪种写哪种就行了'''

总结

  • 一般使用默认配置就可以了,如果需要搭配配置,局部和全局也可以一起使用

DRf 之 Response

导入from rest_framework.response import Response

Reponse常用参数

源码

class Response(SimpleTemplateResponse):
    def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
        ·····
  • data:一般处理成字符串,字典,列表等,给http响应body体中的内容
注意,data可以从response对象中取出来二次处理,返回成我想要的样子
Response.data['msg'] = '再加点料'
  • status:响应状态码,可以导入,比如:from rest_framework.status import HTTP_201_CREATED,但是建议自定义,不写默认是200
  • headers:响应头(字典)

ps:上三常用,下三了解即可

  • template_name:模板名称,用浏览器访问需要,默认使用DRF提供的,可以使用自己的
  • exception:异常处理
  • content_type:响应编码格式

局部配置

导入from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer

  • JSONRenderer:json格式渲染器
  • BrowsableAPIRenderer:浏览API渲染器

通过renderer_classes配置解析格式

'''views.py'''
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer

class PublishView(APIView):
    renderer_classes = [JSONRenderer, ]

    ····

注意

如果只配置JSONRenderer,那么浏览器访问也是json格式数据

全局配置

settings.py配置

默认两种都解析,取各自所需

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类
        'rest_framework.renderers.JSONRenderer',  # json渲染器
        'rest_framework.renderers.BrowsableAPIRenderer',  # 浏览API渲染器
    )
}

总结

  • 还是一般采用默认配置即可~

相关文章