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