首页 > 其他 > 详细

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

时间:2020-11-06 22:46:30      阅读:63      评论:0      收藏:0      [点我收藏+]

请求

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)

 

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

原文:https://www.cnblogs.com/nq31/p/13925325.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!