zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    HTML 5 标准属性
    启程
    【Java】自定义登陆拦截器
    【Java】将List中的实体按照某个字段进行分组的算法
    SpringBoot + MultipartFile 实现文件上传以及文件转移的功能以及配置全局捕获上传文件过大异常
    MySQL查询两门及两门以上不及格的学生,显示姓名
    java中可以用==来比较两个字符串是否相等吗
    自己动手Jquery插件
    10个可以直接拿来用的JQuery代码片段
    linux 安装python
  • 原文地址:https://www.cnblogs.com/nq31/p/13925325.html
Copyright © 2011-2022 走看看