django rest framework 官网
在学习django rest framework(下面简称drf)之前需要知道
对RESTful API设计有一定了解 对django框架有一定认识,本身drf就是基于django做的 对python面向对象编程有了解(drf会对一些原生的django类做封装)一、前言
在学习drf
之前的时候,先简单说一下需要的预备知识。在django
中,路由匹配之后,会进行路由分发,这个时候会有两种选择模式的选择。也就是FBV
与CBV
。
1、FBV
fbv就是在url中一个路径对应一个函数
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.index)]
在视图函数中
def index(request): return render(request, 'index.html')
2、CBV
cbv就是在url中一个路径对应一个类,drf主要使用CBV
urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/', views.IndexView.as_view()) # 执行类后面的as_view()方法,是父类里面的方法]
在视图函数中
from django.views import Viewclass IndexView(View): # 以get形式访问会执行get函数,一般情况下获取数据 def get(self, *args, **kwargs): return HttpResponse('666') # 以post形式访问的话会执行post函数,一般情况下发送数据 def post(self, *args, **kwargs): return HttpResponse('999')
我们在路由匹配的时候看到url(r'^index/', views.IndexView.as_view())
,那这个as_view()
是什么,既然我们在视图类中没有定义这个as_view()
方法,就应该到父类(也就是IndexView的父类View)中看一下View
。以下是django源码,路径是/django/views/generic/base.py,
class View: http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace'] # 支持的各种http方法 def __init__(self, **kwargs): pass @classonlymethod def as_view(cls, **initkwargs): # url路由匹配进入as_view方法 def view(request, *args, **kwargs): return self.dispatch(request, *args, **kwargs) # 返回dispath方法 return view def dispatch(self, request, *args, **kwargs): # dispath方法是drf的关键,dispath方法会通过反射,通过请求的方法,分发到各个视图类的方法中 pass
3、django的请求周期
因此根据CBV和FBVdjango的生命周期可以又两类
FBV:请求通过uwsgi网关,中间件,然后进入路由匹配,进入视图函数,连接数据库ORM操作,模板渲染,返回经过中间件,最终交给浏览器response字符串。
CBV:请求通过uwsgi网关,中间件,然后进入路由匹配,这里就与FBV有区别了,因为不再是试图函数而是视图类,说的详细一点,先经过父类View的dispath方法,进行请求方法的判断,在分发到视图类的方法,连接数据库ORM操作,模板渲染,返回经过中间件,最终交给浏览器response字符串。
新闻热点
疑难解答