Django-视图CBV执行流程详解

简介: FBV和CBV其实就是要么写函数要么写类,那么内部原理是怎么实现?FBV写法def func_view(request): "Function views" if request.
  • FBV和CBV其实就是要么写函数要么写类,那么内部原理是怎么实现?

FBV写法

def func_view(request):
    "Function views"
    if request.method == "GET":
        return HttpResponse("GET-请求")
    elif request.method == "POST":
        return HttpResponse('POST-请求')
    elif request.method == "PUT":
        return HttpResponse('PUT-请求')
    elif request.method == "DELETE":
        return HttpResponse('DELETE-请求')
    else:
        return HttpResponse("不支持的请求类型")

CBV写法

class MyClassView(View):
    def get(self, request, *args, **kwargs):
        return HttpResponse("GET-请求")

    def post(self, request, *args, **kwargs):
        return HttpResponse("POST-请求")

    def put(self, request, *args, **kwargs):
        return HttpResponse("PUT-请求")

    def delete(self, request, *args, **kwargs):
        return HttpResponse("DELETE-请求")

原理

  • FBV可以直接通过路由,调用到相应的视图函数,那么CBV呢?
img_ed1803c6efe0573b9527bf70d116f013.png
微信截图_20190107211036
  • 在我们的MyClassViewl里面没有as_view(),所以我们可以去父类找
img_2a8b6426b11c002333b88793cacc2f96.png
微信截图_20190107211509
  • 父类的as_view()方法
img_f2e25ad484e30c57017cbe866975eac0.png
微信截图_20190107211710
  • 在as_view()中也返回一个view
img_4c854659141dc05a2636d857601cfc90.png
微信截图_20190107212833
  • 分析as_view()当中的代码,调用了dispatch()方法
img_6e85d87c7a8c874badea6be2239996d9.png
微信截图_20190107213123
  • 在分析dispatch()方法前,我们先看看,当请求进来,通过URL先执行了as_view()函数,本质还是在执行内部的view()函数,而view()函数内部是执行了dispatch()方法
img_46e28bb764eb8dbb37471729debb085c.png
微信截图_20190107213809
  • 不管什么请求进来,都执行dispatch()
img_afda5ba44e0eac94befc41ce4de866af.png
微信截图_20190107213912
  • 由于我们MyClassView里面没有dispatch()方法,所以会调用父类的dispatch(),如果我们有,那么会调用我们自己写的dispatch()方法
img_e3f975a12710557809370221b395600d.png
微信截图_20190107214135
img_fc1bb02a4a071ba4a335a268a79f64a5.png
微信截图_20190107214459
  • 我们可以不看父类如何实现,我们可以自己尝试的写一下
img_5b2828dc008d631f9a4efdd3831bed1c.png
微信截图_20190107214847
  • 通过postman验证,发现也完成了这个相同的功能
img_dd7215c975dfb60ece0921ce0bb2a41f.png
微信截图_20190107215246
  • 修正错误
img_5ba7ef97019af7b6b11724214ed5513b.png
微信截图_20190107215130
  • postman验证效果
img_6e55beb32f4cf7cf25ffd03ab84835c7.png
微信截图_20190107215339
  • 观察父类的dispatch做什么?(其实本质就是基于反射实现)
img_a10eb3c1d24b00daf21c1ca77706b446.png
微信截图_20190107215905

结论: CBV基于反射实现根据请求方式不同,执行不同方法

原理总结:
路由url -- > view函数 --> dispatch方法(根据反射来执行:GET/POST/PUT/DELETE等等....)

目录
相关文章
|
3月前
|
JSON 前端开发 API
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
Django 后端架构开发:通用表单视图、组件对接、验证机制和组件开发
65 2
|
3月前
|
JSON 数据处理 API
Django后端架构开发:视图与模板的正确使用
Django后端架构开发:视图与模板的正确使用
34 1
|
2月前
|
数据处理 Python
Django视图:构建动态Web页面的核心技术
Django视图:构建动态Web页面的核心技术
|
3月前
|
C++ Python
Django视图函数VS类视图:如何选择最适合你的开发方式?
【8月更文挑战第31天】本文对比了Django中的函数视图和类视图。函数视图直接处理HTTP请求和响应,灵活且易于维护,适用于简单业务逻辑;类视图基于Python类,提供更丰富的功能和更高的灵活性,适合处理复杂业务逻辑。选择哪种视图取决于具体需求,合理使用两者可帮助你构建高效且易维护的Django应用。
60 0
|
3月前
|
安全 API Python
Django 如何使用视图动态输出 CSV 以及 PDF
Django 如何使用视图动态输出 CSV 以及 PDF
49 4
|
3月前
|
Linux Shell 数据库
python Django教程 之 安装、基本命令、视图与网站
python Django教程 之 安装、基本命令、视图与网站
|
4月前
|
API 数据库 数据安全/隐私保护
Django配置api、管理系统和视图
Django配置api、管理系统和视图
119 1
|
4月前
|
存储 JavaScript 前端开发
Django + Vue 实现图片上传功能的全流程配置与详细操作指南
 在现代Web应用中,图片上传是一个常见且重要的功能。Django作为强大的Python Web框架,结合Vue.js这样的现代前端框架,能够高效地实现这一功能。本文将详细介绍如何在Django项目中配置图片上传的后端处理,并在Vue前端实现图片的选择、预览和上传功能。
|
3月前
|
测试技术 Shell 数据库
Django视图测试:构建可靠Web应用的关键步骤
Django视图测试:构建可靠Web应用的关键步骤
30 0
|
5月前
|
安全 API Python
Django 如何使用视图动态输出 CSV 以及 PDF
这一篇我们需要用到 python 的 csv 和 reportLab 库,通过django视图来定义输出我们需要的 csv 或者 pdf 文件。