Django 视图探秘:FBV与CBV注册方式的异同,揭秘as_view()的执行魔法

2024-06-05 09:36

本文主要是介绍Django 视图探秘:FBV与CBV注册方式的异同,揭秘as_view()的执行魔法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述


文章目录

  • 一、FBV、CBV注册方式及其区别
    • FBV
    • CBV
  • 二、as_view()函数
    • 查看对应的view函数具体内容,最终返回的是dispatch方法
    • 查看dispatch方法


一、FBV、CBV注册方式及其区别

FBV

FBV:path('index/',views.index)
通过调用函数方式,views.index是一个普通函数
路由分发,匹配到对应的路由后,会调用上面的index方法

CBV

​ CBV: path('login/',LoginView.as_view())
通过继承Django的View类来实现
​路由分发,匹配到对应的路由后,会调用上面的LoginView.as_view()方法,

二、as_view()函数

在这里插入图片描述

查看对应的view函数具体内容,最终返回的是dispatch方法

在这里插入图片描述

查看dispatch方法

在这里插入图片描述

图中翻译:

Try to dispatch to the right method; if a method doesn’t exist,the error handler. Also defer to the error handler if the request method isn’t on the approved list.

翻译:尽量用正确的方法调度;如果一个方法不存在,则返回错误处理程序。如果请求方法不在批准的列表中,也要服从错误处理程序。

图中代码解释:
request.method.lower()就是把请求方式改成小写(例如get请求方式),request.method就是请求方式,lower()就是改成小写

http_method_names:
在这里插入图片描述
getattr() :

getattr() 函数在Python中用于从对象中获取指定属性的值。
语法是getattr(对象, 属性, 默认值)
对象 是要从中获取属性值的对象。
属性 是要获取其值的属性的名称。
默认值(可选)是在属性不存在时要返回的值(如果不提供,则会引发 AttributeError)。

所以这里代码的意思就是if判断request.method.lower()请求的方法在 self.http_method_names:里面的话,就执行 getattr方法,self就是我们一开始定义的LoginView类对象,所以这里的

 handler =getattr( self, request.method.lower(),self.http_method_not_allowed )

的意思就是(注意:假设这里请求的是get方式):把LoginView.get(注意:不存在就会执行self.http_method_not_allowed 方法)赋值给handler,最后通过

return handler(request, *args, **kwargs)

返回并且执行LoginView.get方法,刚开始赋值给handler的时候并没有执行.get方法,是最后return handler(request, *args, **kwargs)相当于LoginView.get+()加了个括号才算是执行的这个方法


在这里插入图片描述

这篇关于Django 视图探秘:FBV与CBV注册方式的异同,揭秘as_view()的执行魔法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1032713

相关文章

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

Spring中配置ContextLoaderListener方式

《Spring中配置ContextLoaderListener方式》:本文主要介绍Spring中配置ContextLoaderListener方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录Spring中配置ContextLoaderLishttp://www.chinasem.cntene

AJAX请求上传下载进度监控实现方式

《AJAX请求上传下载进度监控实现方式》在日常Web开发中,AJAX(AsynchronousJavaScriptandXML)被广泛用于异步请求数据,而无需刷新整个页面,:本文主要介绍AJAX请... 目录1. 前言2. 基于XMLHttpRequest的进度监控2.1 基础版文件上传监控2.2 增强版多

Docker镜像修改hosts及dockerfile修改hosts文件的实现方式

《Docker镜像修改hosts及dockerfile修改hosts文件的实现方式》:本文主要介绍Docker镜像修改hosts及dockerfile修改hosts文件的实现方式,具有很好的参考价... 目录docker镜像修改hosts及dockerfile修改hosts文件准备 dockerfile 文

Linux中的计划任务(crontab)使用方式

《Linux中的计划任务(crontab)使用方式》:本文主要介绍Linux中的计划任务(crontab)使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、前言1、linux的起源与发展2、什么是计划任务(crontab)二、crontab基础1、cro

Win11安装PostgreSQL数据库的两种方式详细步骤

《Win11安装PostgreSQL数据库的两种方式详细步骤》PostgreSQL是备受业界青睐的关系型数据库,尤其是在地理空间和移动领域,:本文主要介绍Win11安装PostgreSQL数据库的... 目录一、exe文件安装 (推荐)下载安装包1. 选择操作系统2. 跳转到EDB(PostgreSQL 的

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Springboot处理跨域的实现方式(附Demo)

《Springboot处理跨域的实现方式(附Demo)》:本文主要介绍Springboot处理跨域的实现方式(附Demo),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录Springboot处理跨域的方式1. 基本知识2. @CrossOrigin3. 全局跨域设置4.