一、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源码分析的更多相关文章

  1. APIview的请求生命周期源码分析

    目录 APIview的请求生命周期源码分析 请求模块 解析模块 全局配置解析器 局部配置解析器 响应模块 异常处理模块 重写异常处理函数 渲染模块 APIview的请求生命周期源码分析 Django项 ...

  2. 老李推荐:第6章8节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-小结

    老李推荐:第6章8节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-小结   本章我们重点围绕处理网络过来的命令的MonkeySourceNetwork这个事 ...

  3. 老李推荐:第6章7节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-注入按键事件实例

    老李推荐:第6章7节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-注入按键事件实例   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜 ...

  4. 老李推荐:第6章6节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令队列

    老李推荐:第6章6节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令队列   事件源在获得字串命令并把它翻译成对应的MonkeyEvent事件后,会把这些 ...

  5. 老李推荐:第6章4节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-翻译命令字串

    老李推荐:第6章4节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-翻译命令字串   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自 ...

  6. 老李推荐:第6章5节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-事件

    老李推荐:第6章5节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-事件   从网络过来的命令字串需要解析翻译出来,有些命令会在翻译好后直接执行然后返回,但有 ...

  7. 老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类

    老李推荐:第6章3节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-命令翻译类   每个来自网络的字串命令都需要进行解析执行,只是有些是在解析的过程中直接执行 ...

  8. 老李推荐:第6章2节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-获取命令字串

    老李推荐:第6章2节<MonkeyRunner源码剖析>Monkey原理分析-事件源-事件源概览-获取命令字串   从上一节的描述可以知道,MonkeyRunner发送给Monkey的命令 ...

  9. 老李推荐:第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles

    老李推荐:第5章7节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles   poptest是国内唯一一家培养测试开 ...

随机推荐

  1. python-day10(正式学习)

    目录 字符编码 计算机基础 文本编辑器存取文件的原理 python解释器执行py文件的原理 python解释器与文本编辑的异同 字符编码介绍 字符编码的分类 乱码分析 总结 文件操作 三种基本操作 文 ...

  2. Redis安全策略

    1. 开启redis密码认证,并设置高复杂度密码 描述 redis在redis.conf配置文件中,设置配置项requirepass, 开户密码认证. redis因查询效率高,auth这种命令每秒能处 ...

  3. Apache+tomcat ajp模式转发域名

    本示例使用Apache24 和 tomcat7.0.62 本机IP:192.168.10.38 要实现的效果 访问来源 192.168.10.38      ---->apache ----&g ...

  4. SQLServer 存储过程详解

    Transact-SQL中的存储过程,非常类似于Java语言中的方法,它可以重复调用.当存储过程执行一次后,可以将语句缓存中,这样下次执行的时候直接使用缓存中的语句.这样就可以提高存储过程的性能. Ø ...

  5. 关于redis的几件小事(七)redis缓存雪崩与穿透

    1.缓存雪崩 (1)什么是缓存雪崩 缓存雪崩指的是在同一时刻,缓存大量失效,导致大量的请求直接到了数据库,数据库压力剧增,引起系统崩溃.可能出现的情况有: ①大量的key设置了相同的过期时间,导致在缓 ...

  6. spark精华面试题

    1.driver的功能是什么? 1)一个Spark作业运行时包括一个Driver进程,也是作业的主进程,具有main函数,并且有SparkContext的实例,是程序的人口点: 2)功能:负责向集群申 ...

  7. 多个分组树分别实现单选jq+angular

    $scope.seletedGroup=[];var $li=$("#departmentsContainer>ol>li");$.each($li,function( ...

  8. 利用mybatis-generator自动生成代码(转)

    利用mybatis-generator自动生成代码 mybatis-generator有三种用法:命令行.eclipse插件.maven插件.个人觉得maven插件最方便,可以在eclipse/int ...

  9. Clob类型转换为String

    SQL CLOB 是内置类型,它将字符大对象存储为数据库表某一行中的一个列值,使用CHAR来存储数据,如XML文档. 如下是一个Clob转换为String的静态方法,可将其放在自己常用的工具类中,想直 ...

  10. apache笔记

    apache笔记 一)两种工作模式 Prefork和worker prefork模式: 一个进程响应一个请求 主进程生成多个工作进程,由工作进程一对一的去响应客户端的请求 过程: 1)用户空间有个具有 ...