DRF之APIView源码简析
一. 安装djangorestframework
安装的方式有以下三种,注意,模块就叫djangorestframework。
方式一:pip3 install djangorestframework
方式二:pycharm图形化界面安装
方式三:pycharm命令行下安装(会装在当前工程所用的解释器下)
二. APIView源码分析
在此强调源码分析时一定要依据属性及方法的查询顺序从底部开始查询,不要直接ctrl + 鼠标左键点过去,因为可能跳过去的是其他类中的方法。除此之外只需搞清楚源码的流程思路即可,不需要每一行代码都要看懂。
从使用rest_framework开始,尽量使用CBV类视图,首先导入APIView:
from rest_framework.views import APIView
以往使用CBV时,我们都是继承django.views中的View,那么让我们来看看继承APIView有什么不一样。
class APIView(View):
可以清楚看到APIView是继承了View的,继续往下:
然后as_view中return的 csrf_exempt(view),让我们看看:
def csrf_exempt(view_func):
"""
Marks a view function as being exempt from the CSRF view protection.
"""
# We could just do view_func.csrf_exempt = True, but decorators
# are nicer if they don't have side-effects, so we return a new
# function.
def wrapped_view(*args, **kwargs):
return view_func(*args, **kwargs)
wrapped_view.csrf_exempt = True
return wraps(view_func, assigned=available_attrs(view_func))(wrapped_view)
里面用了csrf_exempt函数,其实就是我们用来忽略csrf_token校验的装饰器(装饰器也就是一个函数,闭包函数),这意味着继承APIView的CBV将不再进行csrf_token的校验。
然后调用父类的as_view后,父类返回的view被调用时执行self.dispatch():
此时我们要清楚self是我们自定义的继承APIView的类的对象,依据属性与方法的查询顺序,我们从自定义的类中开始查找dispatch方法,一直到APIView类时,我们看看里面有没有dispatch方法:
点击进入APIView所在模块时
然后可以定位到APIView在文件中的位置,可以一眼看到它里面包含的东西:
如果你显示的东西没有这么多,那么你只需要勾选配置中的show members即可:
接着双击dispatch看看APIView重写的dispatch方法:
发现initialize_request方法方法的是一个的对象,而且又是赋值给request,大胆猜测它是对原生request进行的封装
接下来看看Request类中有什么名堂。
那么当我们使用request的点语法时,如果找不到对应的属性或方法,那么会走类的__getattr__方法,所以Request类中重写了__getattr__方法,依次保证我们可以调用原生request的方法:
接下来再看看initial方法:
综述所述,APIView中主要是重写了dispatch方法,封装了原生request,为其提供了额外的属性与方法。除此之外,还提供了身份验证、权限验证以及频率校验。
最新文章
- jquery中on绑定事件
- Java面试常见知识点总结(三)
- W3Cschool菜鸟教程离线版下载链接
- linux 使用rpm安装软件时,遇到";warning: rpmts_HdrFromFdno: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY ";错误
- JavaScript求最大数最小数
- 常用的STL查找算法
- noip2016题解汇总
- Swift 1.2 正式发布 - 带来很多重大改进
- CSS中animate属性
- SPOJ 3693 Maximum Sum(水题,记录区间第一大和第二大数)
- Yii2 富头像上传
- 韩顺平_JAVA_视频教程_下载(打开迅雷,直接复制链接地址即可下载)
- warning: control reaches end of non-void function
- php5.3.*编译出现make: *** [ext/gd/libgd/gd_compat.lo] Error 1 解决方法
- Hive数据倾斜解决办法总结
- 服务消费和负载(Ribbon)
- poi 导入Excel解析 2003 2007
- 程序员面试50题—sizeof的用法(6)
- (转)pathlib路径库使用详解
- 揭开Future的神秘面纱——任务取消
热门文章
- Image图片
- Logback 标准xml参考
- 【问】:和=在map里面的区别
- JAVA WEB基础巩固之Json、Ajax
- golang 统计系统测试覆盖率
- Think 框架漏洞利用
- Spring配置cache(concurrentHashMap,guava cache、redis实现)附源码
- Python - requests发送请求报错:UnicodeEncodeError: 'latin-1' codec can't encode characters in position 13-14: 小明 is not valid Latin-1. Use body.encode('utf-8') if you want to send it encoded in UTF-8.
- java中的while循环和do while循环
- oracle 10g 搭建备库以及一次DG GAP的处理情况