Django CBV源码解析:从as_view到dispatch分发机制

小林子
小林子
发布时间:2026-10-13 | 4人浏览过
原创

本文深入解析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等)执行对应的处理逻辑。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持本站。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表