当前位置: 首页 > news >正文

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 内部 ,先是将请求方式转换并进行校验
    • 然后开始校验需要调用的方法的调用位置,校验成功并拿到需要执行的方法执行
  • 在自己写的类中如果有相关的方法,会首先调用我们重写的类方法,并返回执行结果
    • 如果自己的类里面没有该方法 会去自己的父类中调用 父类的方法
      • 如果父类 以及 基类 都找不到则报错,抛出异常

相关文章:

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)路由对应函…...

vue2+antd——实现权限管理——js数据格式处理(回显+数据结构渲染)

vue2antd——实现权限管理——js数据格式处理 效果图如下:1.需求说明2.如何展开所有子项及孙子项目——在弹窗之前就获取树形结构,然后直接将数据传到弹窗中3.template部分代码4.script的data部分5.权限tree数据处理——将row中的权限分配到具体的value参…...

ffmpeg 4.4 cenc-aes-ctr 加解密 MP4 工程性质分析

目录 一、cenc-aes-ctr 原理介绍 二、显式 cenc-aes-ctr 和隐式 cenc-aes-ctr 三、加密工具---ffmpeg 四、播放---ffplay 五、总结 ​​​​​​​一、cenc-aes-ctr 原理介绍 加密算法:CENC-AES-CTR 使用 AES(Advanced Encryption Standard&…...

网络安全/黑客技术(0基础入门到进阶提升)

前言 前几天发布了一篇 网络安全(黑客)自学 没想到收到了许多人的私信想要学习网安黑客技术!却不知道从哪里开始学起!怎么学 今天给大家分享一下,很多人上来就说想学习黑客,但是连方向都没搞清楚就开始学习…...

栈的三道oj【C++】

栈和队列的相关oj 最小栈思路解决代码 栈的压入弹出序列思路解决代码 逆波兰表达式思路:解决代码 这里就挑了三道题用来熟悉栈 最小栈 力扣链接 咱们已经是高贵的C使用者了,不用像C语言一样从头开始造轮子了 这里我们调用了stack后,就会发…...

AI大模型低成本快速定制法宝:RAG和向量数据库

文章目录 1. 前言2. RAG和向量数据库3. 论坛日程4. 购票方式 1. 前言 当今人工智能领域,最受关注的毋庸置疑是大模型。然而,高昂的训练成本、漫长的训练时间等都成为了制约大多数企业入局大模型的关键瓶颈。 这种背景下,向量数据库凭借其独特…...

文旅媒体有哪些?如何邀请到现场报道?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 中国文旅产业在近年来得到了持续而快速的发展。从产业端看,中国文旅产业呈现出新的发展趋势,其中“文旅”向“文旅”转变成为显著特点。通过产业升级和空间构建&a…...

搭建知识付费系统的最佳实践是什么

在数字化时代,搭建一个高效且用户友好的知识付费系统是许多创业者和内容创作者追求的目标。本文将介绍一些搭建知识付费系统的最佳实践,同时提供一些基本的技术代码示例,以帮助你快速入门。 1. 选择合适的技术栈: 搭建知识付费…...

计算机视觉:使用opencv实现车牌识别

1 引言 汽车车牌识别(License Plate Recognition)是一个日常生活中的普遍应用,特别是在智能交通系统中,汽车牌照识别发挥了巨大的作用。汽车牌照的自动识别技术是把处理图像的方法与计算机的软件技术相连接在一起,以准…...

用封面预测书的价格【图像回归】

今天,我将介绍计算机视觉的深度学习应用,用封面简单地估算一本书的价格。 我没有看到很多关于图像回归的文章,所以我为你们写这篇文章。 距离我上一篇文章已经过去很长时间了,我不得不承认,作为一名数据科学家&#x…...

阿里云服务器e实例40G ESSD Entry系统盘、2核2G3M带宽99元

阿里云99元服务器新老用户同享2核2G经济型e实例、3M固定带宽和40G ESSD Entry系统盘,老用户也可以买,续费不涨价依旧是99元一年,阿里云百科aliyunbaike.com分享阿里云3M带宽服务器40G ESSD Entry云盘性能说明: 阿里云99元服务器配…...

Datawhale智能汽车AI挑战赛

1.赛题解析 赛题地址:https://tianchi.aliyun.com/competition/entrance/532155 任务: 输入:元宇宙仿真平台生成的前视摄像头虚拟视频数据(8-10秒左右);输出:对视频中的信息进行综合理解&…...

pyclipper和ClipperLib操作多边型

目录 1. 等距离缩放多边形 1.1 python 1.2 c 1. 等距离缩放多边形 1.1 python 环境配置pip install opencv-python opencv-contrib-python pip install pyclipper pip install numpy import cv2 import numpy as np import pyclipperdef equidistant_zoom_contour(contour…...

Golang 协程、主线程

Go协程、Go主线程 1)Go主线程(有程序员直接称为线程/也可以理解成进程):一个Go线程上,可以起多个协程,你可以这样理解,协程是轻量级的线程。 2)Go协程的特点 有独立的栈空间 共享程序堆空间 调度由用户控制 协程是轻量级的线程 go线程-…...

【SA8295P 源码分析】125 - MAX96712 解串器 start_stream、stop_stream 寄存器配置 过程详细解析

【SA8295P 源码分析】125 - MAX96712 解串器 start_stream、stop_stream 寄存器配置 过程详细解析 一、sensor_detect_device():MAX96712 检测解串器芯片是否存在,获取chip_id、device_revision二、sensor_detect_device_channels() :MAX96712 解串器 寄存器初始化 及 detec…...

pandas教程:Apply:General split-apply-combine 通常的分割-应用-合并

文章目录 10.3 Apply:General split-apply-combine(应用:通用的分割-应用-合并)1 Suppressing the Group Keys(抑制组键)2 Quantile and Bucket Analysis(分位数与桶分析)3 Example:…...

第一讲之递归与递推下篇

第一讲之递归与递推下篇 带分数费解的开关飞行员兄弟翻硬币 带分数 用暴力将所有全排列的情况都算出来 > 有三个数,a,b,c 每种排列情况,可以用两层for循环,暴力分为三个部分,每个部分一个数 当然注意这里,第一层fo…...

第十六篇-Awesome ChatGPT Prompts-备份

Awesome ChatGPT Prompts——一个致力于提供挖掘ChatGPT能力的Prompt收集网站 https://prompts.chat/ 2023-11-16内容如下 ✂️Act as a Linux Terminal Contributed by: f Reference: https://www.engraved.blog/building-a-virtual-machine-inside/ I want you to act as a…...

Python Web框架Django

Python Web框架Django Django简介第一个Django应用Django核心概念Django django-adminDjango项目结构Django配置文件settingsDjango创建和配置应用Django数据库配置Django后台管理Django模型Django模型字段Django模型关联关系Django模型Meta 选项Django模型属性ManagerDjango模…...

1.Spring的简单使用

简介 本文是介绍spring源码的开始,先了解最基础的使用,最深入源码。 spring源码下载地址 https://github.com/spring-projects/spring-framework.git 依赖 依赖 spring-context dependencies {implementation(project(":spring-context")…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

android RelativeLayout布局

<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

AD学习(3)

1 PCB封装元素组成及简单的PCB封装创建 封装的组成部分&#xff1a; &#xff08;1&#xff09;PCB焊盘&#xff1a;表层的铜 &#xff0c;top层的铜 &#xff08;2&#xff09;管脚序号&#xff1a;用来关联原理图中的管脚的序号&#xff0c;原理图的序号需要和PCB封装一一…...