请看图!!
这个url表明在views这个视图下找到Class PublishView,再在这个类下面找到这个as_view()函数,返回一个函数名。当被调用的时候,执行这个函数。
但是我们可以看见这里面没有as_view()这个函数,所以往它的父类中寻找。
我们好不容易找到了,那我们来看看这里面到底返回了什么!
这里面又看到了,APIview这类往API这个父类中去执行,as_view()这个函数!
(他到底要干啊!不妨我们在点进去看看)
这里面这个self有点意思,这个self指的是APIview类,这个类下的dispatch这个函数,返回的是这个view这个函数名字。我们知道了返回值,但是又有新的问题,APIview类自己有as_view这个函数,不执行,偏偏非要用父类中的as_view()方法,然后通过父类中的as_view()函数来执行。自己的dispatch()这个函数。这不多此一举吗?
不着急,我们再来看看APIview这个类中的as_view()函数方法!
其实,这里面啥没有写,直接利用类的继承了父类中的as_view()的方法。然后,源码的作者的目的就是要用自己的dispatch()这个函数,
但是自己又不想写as-view()这个函数,所有才用这种继承的方式!来缩减代码!
总结:
用户请求前: 1、视图类调用执行as_view()方法 2、因视图类继承APIview 3、在APIview中找到as_view()方法 4、通过执行父类view中的as_view()方法返回view方法 此时url=["",view.类.as_view()]------>url=["",APIView.as_view()]------->url=["",View.view] 用户发请求 5、执行View中的as_view方法下的view方法, 6、调用dispatch方法,通过判断请求格式,获取视图类的对应的请求方法 7、通过反射执行对应视图类下的应用请求方法得到返回值并返回