drf中的请求模块和渲染模块
请求模块:request对象
APIView

request.py
# 在rest_framework.request.Request实例化方法中
self._request = request 将原生request作为新request的_request属性

# 1) drf 对原生request做了二次封装,request._request就是原生request
# 2) 原生request对象的属性和方法都可以被drf的request对象直接访问(兼容)
# 3) drf请求的所有url拼接参数均被解析到query_params中,所有数据包数据都被解析到data中
使用
class Test(APIView):
def get(self, request, *args, **kwargs):
# url拼接的参数
print(request._request.GET) # 二次封装方式
print(request.GET) # 兼容
print(request.query_params) # 拓展 return Response('drf get ok') def post(self, request, *args, **kwargs):
# 所有请求方式携带的数据包
print(request._request.POST) # 二次封装方式
print(request.POST) # 兼容
print(request.data) # 拓展,兼容性最强,三种数据方式都可以 print(request.query_params) return Response('drf post ok')
渲染模块:浏览器和Postman请求结果渲染数据的方式不一样
源码入口
APIView类的dispatch方法中:self.response = self.finalize_response(request, response, *args, **kwargs)
源码分析
"""
# 最后解析reponse对象数据
self.response = self.finalize_response(request, response, *args, **kwargs) 点进去 # 拿到运行的解析类的对象们
neg = self.perform_content_negotiation(request, force=True) 点进去 # 获得解析类对象
renderers = self.get_renderers() 点进去 # 从视图类中得到renderer_classes请求类,如何实例化一个个对象形参解析类对象列表
return [renderer() for renderer in self.renderer_classes] # 重点:self.renderer_classes获取renderer_classes的顺序
# 自己视图类的类属性(局部配置) =>
# APIView类的类属性设置 =>
# 自己配置文件的DEFAULT_RENDERER_CLASSES(全局配置) =>
# drf配置文件的DEFAULT_RENDERER_CLASSES
"""
全局配置:所有视图类统一处理,在项目的settings.py中
REST_FRAMEWORK = {
# drf提供的渲染类
'DEFAULT_RENDERER_CLASSES': [
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer',
],
}
局部配置:某一个或一些实体类单独处理,在views.py视图类中提供对应的类属性
class Test(APIView):
def get(self, request, *args, **kwargs):
return Response('drf get ok') def post(self, request, *args, **kwargs):
return Response('drf post ok') # 在setting.py中配置REST_FRAMEWORK,完成的是全局配置,所有接口统一处理
# 如果只有部分接口特殊化,可以完成 - 局部配置
from rest_framework.renderers import JSONRenderer
class Test2(APIView):
# 局部配置
renderer_classes = [JSONRenderer]
def get(self, request, *args, **kwargs):
return Response('drf get ok 2') def post(self, request, *args, **kwargs):
return Response('drf post ok 2')
drf中的请求模块和渲染模块的更多相关文章
- drf中的请求与响应
请求与响应(3星) 请求:Request REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST framework提供的扩展了Ht ...
- 第二章、drf框架 - 请求模块 | 渲染模块 解析模块 | 异常模块 | 响应模块 (详细版)
目录 drf框架 - 请求模块 | 渲染模块 解析模块 | 异常模块 | 响应模块 Postman接口工具 drf框架 注册rest_framework drf框架风格 drf请求生命周期 请求模块 ...
- DRF请求流程及主要模块分析
目录 Django中CBV请求生命周期 drf前期准备 1. 在views.py中视图类继承drf的APIView类 2. drf的as_view()方法 drf主要模块分析 1. 请求模块 2. 渲 ...
- DRF框架(一)——restful接口规范、基于规范下使用原生django接口查询和增加、原生Django CBV请求生命周期源码分析、drf请求生命周期源码分析、请求模块request、渲染模块render
DRF框架 全称:django-rest framework 知识点 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下的CBV接口 3.请求组件 ...
- drf框架 - 请求模块 | 渲染模块
Postman接口工具 官方 https://www.getpostman.com/ get请求,携带参数采用Paramspost等请求,提交数据包可以采用三种方式:form-date.urlenc ...
- drf框架概况-resful接口规范-请求模块-渲染模块-Postman-drf请求生命周期
drf框架 全称:django-rest- framework 知识点: """ 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码-基于restful ...
- 3) drf 框架生命周期 请求模块 渲染模块 解析模块 自定义异常模块 响应模块(以及二次封装)
一.DRF框架 1.安装 pip3 install djangorestframework 2.drf框架规矩的封装风格 按功能封装,drf下按不同功能不同文件,使用不同功能导入不同文件 from r ...
- drf路由分发、解析/渲染模块配置、使用admin、自动序列化配置
目录 drf路由分发配置 解析模块配置 渲染模块配置 浏览器渲染打开 浏览器渲染关闭 结论 drf使用后台admin drf序列化模块 serializers.py: views.py:单查群查 测试 ...
- django-rest-framework-源码解析002-序列化/请求模块/响应模块/异常处理模块/渲染模块/十大接口
简介 当我们使用django-rest-framework框架时, 项目必定是前后端分离的, 那么前后端进行数据交互时, 常见的数据类型就是xml和json(现在主流的是json), 这里就需要我们d ...
随机推荐
- 查看两个集合中有没有相同的元素的方法。Collections disjoint
在做项目的时候遇到一个种情况,就是要比较两个集合中是否有相同的元素,经过查找资料,找到了Collections类下的disjoint方法下面做的一个小例子: import java.util.Coll ...
- 201809-2 买菜 Java
思路: 顺序读入,例如:小H装车的时间段为[1,3],小W装车的时间段为[2,4],重叠部分为[2,3],记在数组times[2]中.最后输出时判断数组times中值大于1的(其实就是2),即为重叠部 ...
- mysql自增长字段设置
mysql版本:5.7.27 说明:表中只能设置一个自增长字段[主键.索引(其他普通字段不行))] 设置自增长开始值: ALTER TABLE table_name AUTO_INCREMENT=10 ...
- POJ 1836:Alignment
Alignment Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 14492 Accepted: 4698 Descri ...
- html_位置偏移属性position
定位属性 位置属性position:static.relative.absolute.fixed 偏移属性:top.bottom.left.right 浮动定位属性:float/clear 1.浮动定 ...
- Windb实践之Script Command
1.输出参数 .echo The first argument is ${$arg1}. .echo The fifth argument is ${$arg5}. .echo The fourth ...
- (转)Java中的容器详细总结
Java中的容器详细总结(编辑中) 原文链接:http://anxpp.com/index.php/archives/656/ 注:本文基于 Jdk1.8 编写 通常程序总是根据运行时才知道的某些条件 ...
- Jackknife,Bootstrap, Bagging, Boosting, AdaBoost, RandomForest 和 Gradient Boosting的区别
Bootstraping: 名字来自成语“pull up by your own bootstraps”,意思是依靠你自己的资源,称为自助法,它是一种有放回的抽样方法,它是非参数统计中一种重要的估计统 ...
- Java目录下文件夹的含义和运行机制
Java安装目录下的各个文件夹的意义 >bin 放置Java所有的可执行文件 >include 一些C语言的头文件 >jre Java的运行环境 >lib Java的类库文件 ...
- C# 基础Array
一.Array的作用 连续定义多个相同类型的变量,比如我定义1000个学生的学生年龄,int[] age = new int[1000];不需要慢慢的一个一个变量的定义,数组是不是很方便. 需要注意的 ...