在说CBV模式之前,先看下FBV的url配置方式:

urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^xxx/', login),
url(r'^index/', IndexView.as_view()),
]

FBV的方式,URl中视图函数是一个函数的名字,当访问这个url时才执行这个视图函数。那么猜想CBV也应该是如此,返回一个函数的句柄。

那一步步来看,IndexView.as_view() 是执行 IndexView类中的as_view()方法,IndexView类中没有改方法,那么往父类中找,在父类中找到as_view()方法。如下:

可以发现,在as_view()方法中,返回view。那么上面我们猜想的是正确的。

紧接着,请求来时,执行view方法,而在view方法中,返回了  return self.dispatch(request, *args, **kwargs)

那么,dispatch()中做了上面呢,看下源码:

    def dispatch(self, request, *args, **kwargs):
# Try to dispatch to the right method; if a method doesn't exist,
# defer to the error handler. Also defer to the error handler if the
# request method isn't on the approved list.
if request.method.lower() in self.http_method_names:
handler = getattr(self, request.method.lower(), self.http_method_not_allowed)
else:
handler = self.http_method_not_allowed
return handler(request, *args, **kwargs)

改方法中,返回get()  或者post() 即请求方法的名+()。这样就去执行我们自己写的类中的get或者post方法了。

执行过程大概就是这样。

那么我们也可以重写dispatch(), 在里面加入需要做的事情。如下:

class IndexView(View):

    def dispatch(self, request, *args, **kwargs):
# 执行父类的dispatch()
method = super(IndexView, self).dispatch(request, *args, **kwargs)
"""
在这里可以做一些事,比如所有请求都要执行的事情。然后再分发到对应的get或post或者其他方法上
"""
return method def get(self, request): return HttpResponse('OK') def post(self, request):
return HttpResponse('OK') def put(self, request):
return HttpResponse('OK')


最新文章

  1. ABP理论学习之OWIN集成
  2. makefile变量赋值
  3. 柯尔莫可洛夫-斯米洛夫检验(Kolmogorov–Smirnov test,K-S test)
  4. 【Alpha阶段】第四次Scrum例会
  5. 用window.print()打印指定div里面的内容(转载的)
  6. Oracle数据库对象题库
  7. TP中不区分大小写__APP__和__URL__的注意事项
  8. LMAO?
  9. poj1988 Cube Stacking
  10. APIO2015题解
  11. IIS大数据请求设置方法
  12. PAT-乙级-1006. 换个格式输出整数 (15)
  13. Centos6.5 Qt4开发 Cannot find -lGL QApplication not file or dir
  14. java之自动过滤提交文本中的html代码script代码
  15. GO入门——6. struct与方法
  16. Sql Server 阻塞的常见原因和解决办法
  17. 4.6 C++抽象基类和纯虚成员函数
  18. (贪心)School Marks -- codefor -- 540B
  19. Excel VBA语句集
  20. AJPFX:外汇的点差和点值

热门文章

  1. 题解 POJ1964/UVA1330/SP277 【City Game】
  2. java字符串大小写转换
  3. 如何从git上批量拉取本地当前分支的所有代码
  4. go语言入门(4)函数
  5. php--常见算法2
  6. Pythonic定义
  7. win10软件使用指南备忘录
  8. redis-数据淘汰策略
  9. 第十五届四川省省赛 SCU - 4439 Vertex Cover
  10. 一步一步带你安装史上最难安装的 vim 插件