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
posted @ 2023-02-03 19:49  李阿鸡  阅读(89)  评论(0编辑  收藏  举报
Title