Django CBV源码解析:从as_view到dispatch分发机制
本文深入解析Django基于类的视图(CBV)核心源码。详细阐述as_view()如何返回函数内存地址,以及请求到来时view()如何调用dispatch()实现HTTP方法分发。通过自定义dispatch方法的示例,展示如何利用super().dispatch()实现类似装饰器的逻辑扩展,帮助开发者理解并灵活应用Django视图机制。
在Django项目的views文件中定义一个视图类,并完成相应的路由配置。
class Test(View):
def get(self, request, *args, **kwargs):
return HttpResponse('cbv_get')
def post(self, request, *args, **kwargs):
return HttpResponse('cbv_post')
url(r'test/',views.Test.as_view()),
接下来通过as_view()方法进入源码层面进行查看。

实际上,views.Test.as_view()返回的是一个内存地址,当加上括号被调用时,会执行as_view方法内部的view函数,具体流程可参考下图:

核心逻辑在于dispatch方法,该方法内部完成了请求的分发功能。

如果需要在Test类中自定义dispatch方法,可以参考以下代码实现:
class Test(View):
def dispatch(self, request, *args, **kwargs):
# 加代码
obj = super().dispatch(self, request, *args, **kwargs)
# 加代码
# 实现了一个类似装饰器的效果,比如post请求,如果是json,手动从request里body取出来 再转一下
# 或者走的时候加点cookie
return obj
def get(self, request, *args, **kwargs):
return HttpResponse('cbv_get')
def post(self, request, *args, **kwargs):
return HttpResponse('cbv_post')
整体执行流程总结如下:
CBV模型使用规范
- 在views中编写一个类并继承自View,在该类中定义get方法和post方法。
- 在路由配置中,使用url(r'^test/', views.Test.as_view()),此时第二个参数位置存放的依然是一个函数的内存地址。
- 当有请求进入时,会执行该内存地址指向的函数(即view(request, *args, **kwargs)),本质上是在执行view()。
- view函数内部会调用dispatch()方法。
- dispatch作为分发方法,会根据不同的HTTP请求方式(如GET、POST等)执行对应的处理逻辑。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













