DRF请求解析编码,响应格式配置方法 及Response init实例化参数
drf之请求
Request能够解析前端传入的编码格式
查看源码
APIView 中有属性
parser_classes 就是解析类,我们知道前端传入过来有三种编码方式。
1.form-data 2.urlencoded 3.json
-parser_classes = api_settings.DEFAULT_PARSER_CLASSES 可以看到后面这个应该是个配置我没去drf的配置文件中查找发现
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser'
],
"对应的是三种编码格式"
需求 只接收json格式编码
那么我们知道在drf中配置文件内的'DEFAULT_PARSER_CLASSES'中有三个对应的编码格式。
方式1: 局部配置
视图类中直接修改parser_classes的参数,需要提前导入三种编码格式类
from rest_framework.parsers import JSONParser,FormParser,MultiPartParser
class BookView(APIView):
parser_classes = [JSONParser,] # 编写可以接收的编码格式指定编码类
方式2: 全局配置
我们可以直接在drf的配置文件中直接注释掉不需要使用的编码类,但不支持去动框架源码
我们可以在项目的配置文件中新增这个配置
REST_FRAMEWORK = {
'DEFAULT_PARSER_CLASSES': [
'rest_framework.parsers.JSONParser',
'rest_framework.parsers.FormParser',
'rest_framework.parsers.MultiPartParser',
],
}
请求解析执行顺序:
1.视图类中的parser_classes =[]
2.项目配置文件的REST_FRAMEWORK
3.drf配置文件的REST_FRAMEWORK
drf之响应
Response能够响应的编码格式
drf其实是djiango的一个app,需要在项目配置文件中注册
INSTALLED_APPS = [
'rest_framework'
]
注册完成后我们发送get请求发现浏览器返回了一个渲染后的页面,而在postman中返回的是json格式。
drf 做了判断,浏览器就会返回一个渲染好的页面,而postman只返回json格式数据
我们根据request的请求配置,联想到那么Response应该有两个响应类
去drf配置文件中查找
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
],
发现有分别有两 JSONRenderer,BrowsableAPIRenderer
需求 更改响应格式
APIView 中有属性
renderer_classes 就是响应类
-renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES
方法1: 视图类
导入模块
from rest_framework.renderers import JSONRenderer,BrowsableAPIRenderer
class BookView(APIView):
renderer_classes = [JSONRenderer,] # 只响应json格式
方法2:配置文件
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.TemplateHTMLRenderer',
],
}
可以选择性注释掉响应格式
响应格式执行顺序:
1.视图类中的renderer_classes =[]
2.项目配置文件的REST_FRAMEWORK
3.drf配置文件的REST_FRAMEWORK
Response源码分析
# drf 的Response 源码分析
-from rest_framework.response import Response
-视图类的方法返回时,retrun Response的时候走它的__init__,init中可以传很多参数
# Response init可以传的参数
def __init__(self,
data=None,
status=None,
template_name=None,
headers=None,
exception=False,
content_type=None)
了解:
-template_name:了解即可,修改响应模板的样子,BrowsableAPIRenderer定死的样子,后期公司可以自己定制
-content_type :响应编码格式,一般不动
init参数重点
-data:之前咱们写的ser.data 可以是字典或列表,字符串,序列化后返回给前端,前端在响应体中(响应的body体)看到的就是这个
-status:http响应的状态码,默认是200,你可以改
return Resopnse('字符串',status=201)
drf在status包下,把所有http响应状态码都写了一遍,常量
from rest_framework.status import HTTP_200_OK
Response('dddd',status=status.HTTP_200_OK)
-headers:响应头,http响应的响应头
return Resopnse('字符串',status=201,headers={'xx':'aa'})
原生djagno,如何像响应头中加东西
# 四件套 render,redirect,HttpResponse,JsonResponse
obj = HttpResponse('dddd')
obj['xxc'] = 'yyc'
return obj