Django知识

目录

一.request对象方法

1.request.method

2.request.POST

3.request.GET

4.request.FILES

5.request.path

二.FBV与CBV引入

1.FBV

2.CBV

(1)路由

(2)视图

3.详解

(1)FBV

(2)CBV

(3)小结

三.CBV源码剖析

1.as_view方法

(1)路由对应函数内存地址

(2)view方法剖析

(3)小结


一.request对象方法

1.request.method

该方法返回客户端用于发起请求的HTTP方法,例如可以是'GET','POST','PUT','DELETE'等,可以使用该方法来确定请求的类型,并相应的执行特定操作

2.request.POST

该属性是一个类似字典的对象,包含了请求中通过POST方法发送的所有参数,这些参数通常是通过HTML表单发送的,可以使用参数的名字作为键来访问单个参数

3.request.GET

类似于request.POST,该属性包含了请求中通过GET方法发送的所有参数,这些参数通常会附加在URL之后,以问号分隔,可以使用参数的名字作为键来访问单个参数

4.request.FILES

该属性是一个类似字典的对象,包含了请求中通过文件上传组件发送的所有文件,当表单中包含文件上传字段时,通过request.FILES可以访问上传的文件,可以使用文件的名字作为键来访问单个文件

5.request.path

只能获取到路由地址,无法获取到参数

二.FBV与CBV引入

视图函数既可以是函数也可以是类

1.FBV

def index(request):return HttpResponse('index')

2.CBV

(1)路由

# CBV路由 根据请求方式的不同选择不同的入口动作
url('^login/',views.MyLogin.as_view())

(2)视图

from django.views import Viewclass MyLogin(View):def get(self,request,*args,**kwargs):return HttpResponse("get")def post(self,request,*args,**kwargs):return HttpResponse("post")

3.详解

FBV(Function-Based Views)与 CBV(Class-Based Views)是 Django 框架中用于处理视图(Views)的两种不同的编程方式。

(1)FBV

  • FBV是Django最早支持的一种视图编程方式
  • 使用函数作为视图的处理逻辑,函数参数通常是request对象,表示用户发送的HTTP请求
  • 函数内部可以根据请求方法、参数、数据等进行相应的处理,并返回HttpResponse对象作为响应
from django.http import HttpResponsedef my_view(request):# 处理逻辑if request.method == 'GET':# 处理 GET 请求return HttpResponse('Hello, GET Request!')elif request.method == 'POST':# 处理 POST 请求return HttpResponse('Hello, POST Request!')

(2)CBV

  • CBV是Django提供的另一种视图编程方式,引入了面向对象的概念
  • 使用类来表示视图,并使用类中的方法来处理不同类型的HTTP请求
  • Django提供了许多内置的CBV类,可以方便的扩展和重写这些类来实现自定义功能
from django.http import HttpResponse
from django.views import Viewclass MyView(View):def get(self, request):# 处理 GET 请求return HttpResponse('Hello, GET Request!')def post(self, request):# 处理 POST 请求return HttpResponse('Hello, POST Request!')

(3)小结

  • 选择FBV还是CBV取决于具体的需求和个人偏好
  • FBV相对简单直观,适合编写简单的视图逻辑
  • CBV可以通过继承和重写类来实现代码复用和可扩展性,适用于复杂的视图处理场景
  • 在实际开发中,可以根据需求选择适合的方式来编写视图处理函数或类

三.CBV源码剖析

1.as_view方法

(1)路由对应函数内存地址

url(r'^login/', views.MyLogin.as_view()),

方法/函数名 加 括号 执行优先级最高

  • 可能的原因
    • 要么是被@staicmethod方法修饰的静态方法
    • 要么是被@classmethod方法修饰的类方法
  • 查看源代码
    • 绑定给类的静态方法,将类作为第一个参数传进去
	@classonlymethoddef as_view(cls, **initkwargs):"""Main entry point for a request-response process."""for key in initkwargs:if key in cls.http_method_names:raise TypeError("You tried to pass in the %s method name as a ""keyword argument to %s(). Don't do that."% (key, cls.__name__))if not hasattr(cls, key):raise TypeError("%s() received an invalid keyword %r. as_view ""only accepts arguments that are already ""attributes of the class." % (cls.__name__, key))def view(request, *args, **kwargs):self = cls(**initkwargs)if hasattr(self, 'get') and not hasattr(self, 'head'):self.head = self.getself.request = requestself.args = argsself.kwargs = kwargsreturn self.dispatch(request, *args, **kwargs)view.view_class = clsview.view_initkwargs = initkwargs# take name and docstring from classupdate_wrapper(view, cls, updated=())# and possible attributes set by decorators# like csrf_exempt from dispatchupdate_wrapper(view, cls.dispatch, assigned=())return view
  • view这是一个闭包函数
    • 返回值是这个闭包函数的内存地址
  • 在启动Django项目时,就会立即执行as_view方法
url(r'^login/',views.view()),
  • 方法类似FBV方法

总结:CBV和FBV在路由匹配本质上是一样的,都是路由对应函数内存地址

(2)view方法剖析

    def view(request, *args, **kwargs):# 参数 cls 就是我们自己写的类self = cls(**initkwargs)# 等价于 self = MyLogin(**initkwargs) ---- 产生一个我们自己写的类的对象if hasattr(self, 'get') and not hasattr(self, 'head'):self.head = self.get# 给我们的对象赋值属性self.request = requestself.args = argsself.kwargs = kwargs'''在看python源码的时候,一定要时刻注意面向对象属性方法查找顺序先从对象自己找再去产生对象的类里面找之后再去父类找总结:在看源码时,如果遇到 self.x 操作时,一定要时刻注意当前这个self到底是谁'''return self.dispatch(request, *args, **kwargs)
 http_method_names = ['get', 'post', 'put', 'patch', 'delete', 'head', 'options', 'trace']# CBV 的 精髓 !!!def dispatch(self, request, *args, **kwargs):# Try to dispatch to the right method; if a method doesn't exist,# defer to the error handler. Also defer to the error handler if the# request method isn't on the approved list.# 获取当前请求的小写格式 然后比对当前请求方式是否合法# 以 get 请求为例if request.method.lower() in self.http_method_names:'''反射:通过字符串来操作对象的属性或方法'''# self 是我们自己写的类产生的对象# handler = getattr(自己写的类产生的对象,'get',当找不到get属性或方法时就会用到第三个参数)# 因为我们在自己的类里面重写了 get 方法 ,所以这里的 handler 就变成了我们自己写的 get方法# handler = 我们自己写的类里面的get方法handler = getattr(self, request.method.lower(), self.http_method_not_allowed)else:handler = self.http_method_not_allowed# 自动调用 get 方法return handler(request, *args, **kwargs)

(3)小结

url(r'^login/', views.MyLogin.as_view()),
  • 当我们启动Django项目时
  • 会自动触发路由中的方法,调用 as_view 方法并自执行
  • 在执行后我们查看 as_view 方法的源码 发现
    • 在依次给我们的对象赋值后,最终返回了一个自执行的 dispatch 方法
  • 于是我们又去查看了 dispatch 方法
    • 在 dispatch 内部 ,先是将请求方式转换并进行校验
    • 然后开始校验需要调用的方法的调用位置,校验成功并拿到需要执行的方法执行
  • 在自己写的类中如果有相关的方法,会首先调用我们重写的类方法,并返回执行结果
    • 如果自己的类里面没有该方法 会去自己的父类中调用 父类的方法
      • 如果父类 以及 基类 都找不到则报错,抛出异常

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/142954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Audio实战——音量设置Hal(二十)

本来上一篇分析音量设置中对于 setCurrentGainIndex 方法我们分析到了 native 层就没有往下分析,但这这里还有准备再看看下面的流程。 一、源码分析 1、android_media_AudioSystem.cpp 源码位置:frameworks/base/core/jni/android_media_AudioSystem.cpp static jint and…

smt贴片加工上料错误怎么控制?

SMT贴片加工上料错误怎么控制?电子行业的持续创新挑战着该行业各个层次的供应商,以制造出在尺寸和性能方面具有越来越强大功能的设备。在这种情况下,电路板的设计开发与实际生产之间的差距是趋于增加,特别是因为设计人员通常没有与…

Ubuntu20.04 安装 Matlab R2021a

1. 压缩包分卷解压缩 将下载下来的压缩包分卷解压缩 Ubuntu自带的archive会解压出错,不适用于分卷解压。 需要下载7zip (sudo apt-get install 走起) zip -F xxx.zip --out XXX.zip # xxx为主文件名 # XXX.zip为输出路径,上面的…

【git】git本地仓库命令操作详解

这篇文章主要是针对git的命令行操作进行讲解,工具操作的基础也是命令行,如果基本命令操作都不理解,就算是会工具操作,真正遇到问题还是一脸懵逼 1.操作逻辑图 本地仓库的命令操作关系图 2.基本命令操作 1.1建立一个gittest01文…

二维码智慧门牌管理系统升级解决方案:标准地址ID查询服务:高效、精准

文章目录 前言一、解决查询效率低下的问题二、提高信息精准度三、应用案例 前言 随着城市的发展和信息化步伐的加快,二维码智慧门牌管理系统已成为各大城市管理部门和企事业单位的必备工具。然而,实际应用中存在一些问题,如查询效率低下、信…

navicat导入已有sql表过程

已知我有一个外部的sql表,如图: 想要将其导入navicat并运行。 看一下我的navicat, navicat里已有的数据库并没有library,所以需要建立一个同名的library数据库来存储library.sql文件。 具体步骤如下: 在“本地连接”…

「Verilog学习笔记」优先编码器Ⅰ

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 分析 分析编码器的功能表: 当使能El1时,编码器工作:而当E10时,禁止编码器工作,此时不论8个输入端为何种状态&…

U盘格式化数据恢复软件EasyRcovery2024免费版

出差办公,我习惯将所有的文件都拷贝到U盘里随身携带,这样就省去了带电脑的麻烦。U盘虽然方便携带,但也有一个致命的缺陷,就是删除的文件会被彻底清理,而不是保存在回收站。一旦不小心将U盘格式化,对我来说就…

C++入门(1)

目录 一、什么是C 1、C关键字(C98) 2、C兼容C 二、C程序预处理指令 三、命名空间 1、命名冲突 第一种: 第二种: 2、域作用限定符 3、实现命名空间 4、命名空间冲突 5、访问命名空间 6、命名空间“std” 四、输入输出 1、定义 2、自动识…

目标检测——Yolo系列(YOLOv1/2/v3/4/5/x/6/7/8)

目标检测概述 什么是目标检测? 滑动窗口(Sliding Window) 滑动窗口的效率问题和改进 滑动窗口的效率问题:计算成本很大 改进思路 1:使用启发式算法替换暴力遍历 例如 R-CNN,Fast R-CNN 中使用 Selectiv…

通过京东商品ID获取京东优惠券信息,京东优惠券信息接口,京东优惠券API接口,接口说明接入方案

京东商品详情API接口的作用是通过接口获取京东平台上商品的详细信息,包括商品的标题、价格、描述、图片、库存等信息。该接口可以供开发者或第三方使用,以便在自己的应用程序、网站或平台中展示和销售京东的商品。 Java请求示例 import java.io.Buffer…

activiti命令模式与责任链模式

来源:activiti学习(七)——命令模式和职责链模式在activiti中的应用 文章目录 设计模式命令模式CommandHelloCommandByeCommand ReceiverInvokerClient 职责链模式AbstractHandlerConcreteHandlerAConcreateHandlerB Client activiti中很多ap…

SpringBoot实现自定义异常及全局异常处理,赶紧整起来!

文章目录 一、什么是自定义异常及全局异常处理?二、使用步骤1.创建自定义异常BusinessException2.创建全局异常处理器GlobalExceptionHandler3.通用返回ResponseData4.使用 总结 一、什么是自定义异常及全局异常处理? 在web服务中,我们的接口…

SQLServer添加Oracle链接服务器

又一次在项目中用到了在SQLServer添加Oracle链接服务器,发现之前文章写的也不太好使,那就再总结一次吧。 1、安装OracleClient 安装64位,多数SQLServer是64位,所以OracleClient也安装64位的; 再一个一般安装的Oracl…

demo(一)eureka----服务注册与提供

下面写一个简单的demo验证下eureka&#xff0c;实现服务注册、服务发现。 一、单节点&#xff1a; 1、api&#xff1a; 封装其他组件需要共用的dto 2、eureka-service服务注册中心&#xff1a; &#xff08;1&#xff09;pom: <?xml version"1.0" encoding&q…

主从复制和读写分离

MySQL 主从复制和读写分离&#xff1a; 主从复制&#xff1a;主MySQL上的数据&#xff0c;新增&#xff0c;修改库&#xff0c;表&#xff0c;表里的数据&#xff0c;都会同步到从MySQL上。 MySQL的主从复制的模式&#xff1a;&#xff08;面试题&#xff09; 1&#xff0c;异…

【第2章 Node.js基础】2.4 Node.js 全局对象(二) process 对象

process对象是一个全局对象&#xff0c;提供当前Node.js 进程信息并对其进行控制。通常用于编写本地命令行程序。 1.进程事件 process对象是EventEmitter类的实例&#xff0c;因此可以使用事件的方式来处理和监听process对象的各种事件。以下是一些常用的process对象事件&…

3.4 Linux 软件管理

一. RPM 软件包管理器 1、软件包介绍 RPM&#xff08;RedHat Package Manager&#xff09;软件包&#xff1a;扩展名为“.rpm”。RPM本质上就是一个包&#xff0c;包含可以立即在特定机器体系结构上安装和运行的Linux软件。安装RPM软件包需要使用rpm命令或yum命令。 源代码软…

Linux 的端口区间及设置

在 Linux 中&#xff0c;端口区间分配和使用如下&#xff1a; 0到1023端口是系统保留的端口&#xff0c;由一些通用协议、应用程序及其服务使用。这些端口被标识为众所周知的端口&#xff0c;并且不能被用户程序使用。1024到49151端口是为用户程序保留的&#xff0c;通常也称为…

荧光量子效率积分球的优势是什么

荧光量子效率积分球是一种测量设备&#xff0c;可以用于测量荧光材料在特定波长下的量子效率。它由一个具有高朗伯特性的漫反射PTFE材料制成&#xff0c;具有高达99%的反射率和朗伯特性。积分球有三个开口&#xff0c;分别为光入射口、样品口和光出射口。光入射口设置有一准直镜…