DRF 中Request对象和Response对象的常用方法和参数,如何局部/全局配置解析格式都在这里👆
Request是包装后的request,前面源码分析过了
不会DRF?源码都分析透了确定不来看? - HammerZe - 博客园 (cnblogs.com)
前面的文章介绍到,新包装的Request对象和原来django的request对象没有什么区别,使用方法一样,只是多了request.data
,当然区别也不止这一点,我们看一下目录
__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
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
默认的情况下,三种数据格式(urlencoded,formdata,json)都可以解析
比如当请求(post)过来要新增一条数据,那么我们可以针对该请求的数据格式做要求,比如只能提交json格式,或者允许From-data和json等···通过写接口实现,需要进行局部(views)或者全局配置(settings)
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
'''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',
],
}
'''默认是三种数据格式都解析的,想解析哪种写哪种就行了'''
总结
导入:from rest_framework.response import Response
源码
class Response(SimpleTemplateResponse):
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
·····
注意,data可以从response对象中取出来二次处理,返回成我想要的样子
Response.data['msg'] = '再加点料'
ps:上三常用,下三了解即可
导入:from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
通过renderer_classes配置解析格式
'''views.py'''
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class PublishView(APIView):
renderer_classes = [JSONRenderer, ]
····
注意
如果只配置JSONRenderer,那么浏览器访问也是json格式数据
settings.py配置
默认两种都解析,取各自所需
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默认响应渲染类
'rest_framework.renderers.JSONRenderer', # json渲染器
'rest_framework.renderers.BrowsableAPIRenderer', # 浏览API渲染器
)
}
总结
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://www.cnblogs.com/48xz/p/16084611.html
内容来源于网络,如有侵权,请联系作者删除!