一. 安装 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, 为其提供了额外的属性与方法. 除此之外, 还提供了身份验证, 权限验证以及频率校验.
来源: http://www.bubuko.com/infodetail-3120058.html