APIView源码与Request源码分析
一、APIView源码分析
1、安装djangorestframework

2、使用
drf是基于cbv view的封装,所以必须写cbv
①第一步:写视图,必须写cbv
路由配置:
from rest_framework.views import APIView
from django.http import JsonResponse
class Books(APIView):
def get(self, request):
# request是被封装后的request,原生的request在request._request
# 如果想用原生request中的属性,还是原来的用法,因为Request重写了__getattr__方法
# 原生django只能处理urlencoded和form_data编码,如果是json格式,原生django是不能处理的,需要自己从body中取出来自行处理
# request.data 不管前端传数据的编码格式是urlencoded,form_data或者是json,都从里面取值
# request.data
# request.query_params 是原来django原生的GET中的数据
# self.FILES 就是上传的文件
dic = {'name': 'lqz', 'age': 30, 'height': 178, 'hobby': ['football', 'swimming', 'running']}
return JsonResponse(dic)
②第二步:
在setting中配置:INSTALLED_APPS= ['rest_framework']

3、源码分析
继承了APIView之后:
①所有的请求都没有csrf的认证了

②在APIView中as_view本质还是调用了父类的as_view(View的as_view)

③as_view中调用了dispatch(这个dispatch是APIView的dispatch)
注意:找dispatch不能直接点源码找先要在类里找类没有再去父类里面找

APIView的dispatch方法:
①对原生request对象做了一层包装(面向对象的封装),

以后再用的request对象都新的request对象

②在APIView中self.initial(request, *args, **kwargs),里面有频率控制,权限控制和认证相关

③根据请求方法执行咱们写的视图类中的相应方法 (视图类中方法的request对象,已经变成了封装后的request)

二、request源码分析

①新的request为啥能点出原来的属性:
内部反射在原生的request取出GET,POST,因为Request重写了__getattr__方法,跟原来用法一样

②原生django只能处理urlencoded和form_data编码,如果是json格式,原生django是不能处理的,需要自己从body中取出来自行处理
不管前端传数据的编码格式是urlencoded,form_data或者是json,都从request.data里面取值

③请求里面可以带过滤条件这里就是用到query_params,是原来django原生的GET的数据

④上传的文件是从FILES中取(request.FILES)

总结:
继承了APIView之后:
所有的请求都没有csrf的认证了
在APIView中as_view本质还是调用了父类的as_view(View的as_view)
as_view中调用了dispatch(这个dispatch是APIView的dispatch) APIView的dispatch方法:
对原生的request对象做了一层包装(面向对象的封装),以后再用的request对象都是新的request对象
在APIView中self.initial(request, *args, **kwargs),里面有频率控制,权限控制和认证相关
根据请求方法执行咱们写的视图类中的相应方法(视图类中方法的request对象,已经变成了封装后的request) request类
原生的request是self._request
取以post提交的数据,从request.data中取出(urlencoded, form_data, json格式) query_params 就是原生request的GET的数据
上传的文件是从FILES中取(request.FILES)
(重点)其他的属性,直接request.属性名(因为重写了__getattr__方法) class Books(APIView):
def get(self, request):
# request是被封装后的request,原生的request在request._request
# 如果想用原生request中的属性,还是原来的用法,因为Request重写了__getattr__方法
# 原生django只能处理urlencoded和form_data编码,如果是json格式,原生django是不能处理的,需要自己从body中取出来自行处理
# request.data 不管前端传数据的编码格式是urlencoded,form_data或者是json,都从里面取值
# request.data
# request.query_params 是原来django原生的GET中的数据
# self.FILES 就是上传的文件
dic = {'name': 'lqz', 'age': 30, 'height': 178, 'hobby': ['football', 'swimming', 'running']}
return JsonResponse(dic)
APIView源码与Request源码分析的更多相关文章
- APIview的请求生命周期源码分析
目录 APIview的请求生命周期源码分析 请求模块 解析模块 全局配置解析器 局部配置解析器 响应模块 异常处理模块 重写异常处理函数 渲染模块 APIview的请求生命周期源码分析 Django项 ...
- 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结
老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结 本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...
- 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例
老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...
- 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列
老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列 事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...
- 老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串
老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...
- 老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件
老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件 从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...
- 老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类
老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类 每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行 ...
- 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串
老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串 从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...
- 老李推荐:第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles
老李推荐:第5章7节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles poptest是国内唯一一家培养测试开 ...
随机推荐
- GitHub从小白到熟悉<一>
注册开始
- cut,sort,awk,sed,tr,find,wc,uniq在Linux中的用法
cut语法cut [-bn] [file]cut [-c] [file]cut [-df] [file] -b :以字节为单位进行分割.这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志.-c ...
- EM 算法(二)-KMeans
KMeans 算法太过简单,不再赘述 本文尝试用 EM 算法解释 KMeans,而事实上 KMeans 算是 EM 的一个特例 EM 算法是包含隐变量的参数估计模型,那对应到 KMeans 上,隐变量 ...
- Ruby学习中(哈希变量/python的字典, 简单的类型转换)
一. 哈希变量(相当于Python中的字典) 详情参看:https://www.runoob.com/ruby/ruby-hash.html 1.值得注意的 (1). 创建Hash时需注意 # 创建一 ...
- java基础:强引用、弱引用、软引用和虚引用 (转)
出处文章: Java基础篇 - 强引用.弱引用.软引用和虚引用 谈谈Java对象的强引用,软引用,弱引用,虚引用分别是什么 整体结构 java提供了4中引用类型,在垃圾回收的时候,都有自己的各自特点. ...
- Spring Cloud Gateway真的有那么差吗?
动机 已经不止一次看到"Spring Cloud Gateway性能比Zuul更差"的言论了,不少人人云亦云,来问我,既然如此,那Spring官方还开发Spring Cloud G ...
- Docker:Swarm + Stack 一站式部署容器集群
参考1 参考2 1.注意docker的版本,yum默认安装的版本比较低,可能出现 unsupported Compose file version: 3.7 docker版本升级 2.docker-c ...
- Javascript问题集锦
1.Date.parse()函数兼容性问题: IE Chrome Firefox Date.parse("07-17-2019") 1563292800000 15632928 ...
- JVM--对象访问和OutOfMemoryError异常
对象访问: 使用句柄访问方式: 使用直接指针访问方式: OutOfMemoryError异常: 设置堆的最小最大容量:-Xms20m -Xmx20m 设置一样推不可自动扩展. 设置出现内存溢出 ...
- 精确率与回召率与 F1-Meature
例子: true positive(真正例): 把 Colin power预测为Colin power(55) false positive(假正例): 把 其他人预测为Colin power(4+1 ...