DRF请求和响应,以及Response对象重新封装

请求

rest_framework下的Request类源码分析:

from rest_framework.request import Request
class Request:
    def __init__(self, request, parsers=None, authenticators=None,
                 negotiator=None, parser_context=None):
        assert isinstance(request, HttpRequest), (
            'The `request` argument must be an instance of '
            '`django.http.HttpRequest`, not `{}.{}`.'
                .format(request.__class__.__module__, request.__class__.__name__)
        )
        self._request = request #原生request

    def __getattr__(self, attr):
        """
        通过反射,将原生request对象,以及属性和方法取出
        """
        try:
            return getattr(self._request, attr)
        except AttributeError:
            return self.__getattribute__(attr)

    '''
    通过@property装饰器将data方法封装成属性
    data方法:它是一个字典,post请求不管使用什么编码,传过来的数据,都在request.data
    '''
    @property
    def data(self):
        if not _hasattr(self, '_full_data'):
            self._load_data_and_files()
        return self._full_data
    '''
    get请求的数据都在这里取
    '''
    @property
    def query_params(self):
        """
        More semantically correct name for request.GET.
        """
        return self._request.GET
  '''
     存文件数据
    ''' 
    @property
    def FILES(self):
        if not _hasattr(self, '_files'):
            self._load_data_and_files()
        return self._files

总结:1、将原生的request对象封装成 drf request对象的_request 属性

           2、请求对象.data(request.data):可以把前端传过来的数据(三种编码方式)全部取出来

      3、request.query_params 与Django标准的request.GET等价。

 注意:请求头是存放在request.META中,获取请求头的信息可以从该属性中获取

响应

rest_framework下的Response源码:

#from rest_framework.response import Response
 def __init__(self, data=None, status=None,
                 template_name=None, headers=None,
                 exception=False, content_type=None):
        
#data:你要返回的数据,字典
#status:返回的状态码,默认是200,#template_name 渲染的模板名字(自定制模板),不需要了解
#headers:响应头,可以往响应头放东西,就是一个字典
#content_type:响应的编码格式,application/json和text/html;

注意:
from rest_framework import status
在这个status这个模块下,它把所有使用到的状态码都定义成了常量

响应数据数据格式配置。

-局部使用:对某个视图类有效
     -在视图类中写如下
      from rest_framework.renderers import JSONRenderer
      renderer_classes=[JSONRenderer,]
-全局使用:全局的视图类,所有请求,都有效 -在setting.py中加入如下 REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类 'rest_framework.renderers.JSONRenderer', # json渲染器 'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器 ) }

注意:drf本身默认的配置文件,但是一般配置文件都是先从项目的settings文件中中,找不到,采用默认的

    drf的配置信息,则是先从自己类找那个找,找不到再从项目的settings中找,再找不到,再去默认找

DRF中Response重新封装

from rest_framework.response import Response
class APIResponse(Response):
    def __init__(self,code=100,msg='成功',data=None,status=None,headers=None,**kwargs):
        dic = {'code': code, 'msg': msg}
        if  data:
            dic = {'code': code, 'msg': msg,'data':data}
        dic.update(kwargs)
        super().__init__(data=dic, status=status,headers=headers)
原文地址:https://www.cnblogs.com/nq31/p/13925325.html