DRF框架请求与响应
DRF框架请求与响应
DRF 之Request
Request是包装后的request,前面源码分析过了
不会DRF?源码都分析透了确定不来看? - HammerZe - 博客园 (cnblogs.com)
前面的文章介绍到,新包装的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
配置请求数据格式
默认的情况下,三种数据格式(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',
],
}
'''默认是三种数据格式都解析的,想解析哪种写哪种就行了'''
总结
- 一般使用默认配置就可以了,如果需要搭配配置,局部和全局也可以一起使用
DRf 之 Response
导入:from rest_framework.response import Response
Reponse常用参数
源码
class Response(SimpleTemplateResponse):
def __init__(self, data=None, status=None,
template_name=None, headers=None,
exception=False, content_type=None):
·····
-
data:一般处理成字符串,字典,列表等,给http响应body体中的内容
注意,data可以从response对象中取出来二次处理,返回成我想要的样子 Response.data['msg'] = '再加点料'
-
status:响应状态码,可以导入,比如:from rest_framework.status import HTTP_201_CREATED,但是建议自定义,不写默认是200
-
headers:响应头(字典)
ps:上三常用,下三了解即可
- template_name:模板名称,用浏览器访问需要,默认使用DRF提供的,可以使用自己的
- exception:异常处理
- content_type:响应编码格式
局部配置
导入:from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
- JSONRenderer:json格式渲染器
- BrowsableAPIRenderer:浏览API渲染器
通过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渲染器
)
}
总结
- 还是一般采用默认配置即可~