目录
DRF框架请求与响应
-
DRF 之Request
Request是包装后的request,前面源码分析过了
- 新包装的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
- 新包装的Request对象是通过__getattr__方法反射过来的
-
配置请求数据格式
默认的情况下,三种数据格式(urlencoded,formdata,json)都可以解析
比如当请求(post)过来要新增一条数据,那么我们可以针对该请求的数据格式做要求,比如只能提交json格式,或者允许From-data和json等···通过写接口实现,需要进行局部(views)或者全局配置(settings)-
配置处理顺序
- 局部优先
- 全局其次
- 默认配置最后
-
局部配置
- 导入:
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', ], } '''默认是三种数据格式都解析的,想解析哪种写哪种就行了'''
一般使用默认配置就可以了,如果需要搭配配置,局部和全局也可以一起使用
- 导入:
-
- 新包装的Request对象和原来django的request对象没有什么区别,使用方法一样,只是多了
-
DRf 之 Response
-
Reponse常用参数
-
局部配置
-
全局配置
-