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

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

本文深入解析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 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。