目录
Request可解析编码格式
request可以解析三种由前端传入的编码格式:JSONParser,FormParser,MultiPartParser
当有需要,只接收用户传入的文件,而不接收其它数据的时候,就可以定制传入的格式
- drf的配置文件中默认就指定的可接收的三种格式的配置,如下:
DEFAULTS = {
...
...
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser'
],
...
...
定制传入数据类型格式
方法一,使用parser_classes定制
此方法只是针对一个类,比较有针对性,且优先级最高
class TestView(APIView):
# 需要导入三种数据格式
from rest_framework.parsers import JSONParser, FormParser, MultiPartParser
# 定义一个列表,列表中的内容为可以使用数据格式,这里只允许JSON格式数据
parser_classes = [JSONParser,]
def post(self, request):
print(request.data)
print(type(request.data))
return Response({'code': 'success'})
如图,可以看到导入的格式为非指定格式会报错
方法二,使用settings.py配置
此方法为全局配置,优先级低于在类中配置parser_classes方法
在rest_framework的settings.py中的最顶部可以看到一个注释,大概就是说明如果想在自己的项目中使用配置的话,需要在自己项目的settings.py中添加下面的内容
settings.py中配置
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser', # 我只配置了JSON解析,所以前端在传入其他数据格式时,会报错。
# 'rest_framework.parsers.FormParser',
# 'rest_framework.parsers.MultiPartParser',
],
}
优先级说明
- 类中的parser_classes
- settings.py中的配置
- REST_FRAMEWORK中的settings.py中的配置
以上三个的优先级为 1 > 2 > 3
也就是,当在类中定义了parser_classes,在settings.py中也定义了REST_FRAMEWORK配置,那么,系统会走parser_classes,不会再走settings.py中的配置了。
Response
Response有两种返回方法,JSONRenderer和TemplateHTMLRenderer
优先级高
INSTALLED_APPS = [
...
'rest_framework'
]
方法一,在类中定义Response返回格式
class TestView(APIView):
# 导入相关包
from rest_framework.renderers import JSONRenderer, BrowsableAPIRenderer
# 定义返回的数据格式
renderer_classes = [JSONRenderer, ]
def get(self, request):
return Response({'code': 'success'})
方法二,在settings.py中定义返回格式
在rest_framework的settings.py中的最顶部可以看到一个注释,大概就是说明如果想在自己的项目中使用配置的话,需要在自己项目的settings.py中添加相关配置
优先级低
REST_FRAMEWORK = {
...
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.TemplateHTMLRenderer',
}
优先级说明
- 类中的renderer_classes
- settings.py中的配置
- REST_FRAMEWORK中的settings.py中的配置
以上三个的优先级为 1 > 2 > 3
也就是,当在类中定义了renderer_classes,在settings.py中也定义了REST_FRAMEWORK配置,那么,系统会走renderer_classes,不会再走settings.py中的配置了。
Response init可以传入的参数
def __init__(self,
data=None,
status=None,
template_name=None,
headers=None,
exception=False,
content_type=None)
-
data
- data中的内容可以是“字典,列表,字符串”三种格式,会把序列化后的内容返回给前端。
-
status
- http的响应状态码,默认是200,可以通过下面方法修改
- drf已将所有的http响应状态码全部重写,并且所有的响应状态码是常量
from rest_framework import status
return Response({'code': 'success'}, status=status.HTTP_200_OK)
-
template_name
- 可以修改响应模版的样式,一般用不到
-
headers响应头
- 原生django在响应头中添加定制化内容:
# 四件套 render,redirect,HttpResponse,JsonResponse
obj = HttpResponse('dddd')
obj['定制响应头的键'] = '定制响应头的值'
return obj
- drj定制响应头
return Response({'code': 'success'}, headers={'定制响应头的键':'定制响应头的值'})
- content_type 响应编码格式,一般不动