django rest framework(下面简称 drf)
在 django 中,路由匹配之后,会进行路由分发,这个时候会有两种选择模式,分别是 FBV 与 CBV。
1、FBV
fbv 就是在 url 中一个路径对应一个函数。
在视图函数中
2、CBV
cbv 就是在 url 中一个路径对应一个类,drf 主要使用 CBV。
在视图函数中
在路由匹配的时候看到 path("image", image.ImageView.as_view()),那这个 as_view() 是什么,既然没有在视图类中定义这个 as_view() 方法,就应该到父类(ImageView 的父类 View)中看下 View。
django 源码,路径是 djangoviewsgenericbase.py
3、django 的请求周期
根据 CBV 和 FBV django 的生命周期可以分两类
- FBV:请求通过 uwsgi 网关,中间件,然后进入路由匹配,进入视图函数,连接数据库 ORM 操作,模板渲染,返回经过中间件,最终交给浏览器 response 字符串。
- CBV:请求通过 uwsgi 网关,中间件,然后进入路由匹配,这里就与 FBV 有区别了,因为不再是视图函数而是视图类,会先经过父类-View 的 dispath 方法,进行请求方法的判断,再分发到视图类的方法,连接数据库-ORM 操作,模板渲染,返回经过中间件,最终交给浏览器 response 字符串。
在 drf 中主要使用 CBV,生命周期就变成:
请求通过 uwsgi 网关,中间件,然后进入路由匹配,这里就有区别了,先经过 drf 中-APIView 类中的 dispath 方法(这里假定视图类没有重写 APIView 中的 dispath 方法),在 dispath 中对 request 请求进行封装,反射回到视图类,连接数据库 ORM 操作,模板渲染,返回经过中间件,最终交给浏览器响应字符串。