请求
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)