学习知识随笔(Django)

news2024/9/23 23:24:22

文章目录

  • MVC与MTV模型
    • MVC
    • MTV
  • Django目录结构
  • Django请求生命周期流程图
  • 路由控制
    • 路由是什么
    • 路由匹配
    • 反向解析
    • 路由分发
  • 视图层
    • 视图函数语法
    • reqeust对象属性
    • reqeust对象方法

MVC与MTV模型

MVC

Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M:数据层)控制器(C:逻辑判断)视图(V:用户所看的)三层,他们之间以一种插件式的、松耦合的方式连接在一起,模型负责业务对象与数据库的映射(ORM),视图负责与用户的交互(页面),控制器接受用户的输入调用模型和视图完成用户的请求,其示意图如下所示:

在这里插入图片描述

MTV

Django的MTV模式本质上和MVC是一样的,也是为了各组件间保持松耦合关系,只是定义上有些许不同,Django的MTV分别是值:

  • M 代表模型(Model):负责业务对象和数据库的关系映射(ORM)。(M 就是 MVC 的 M)
  • T 代表模版(Template):负责如果把页面展示给用户(HTML)。(T 就是 MVC 的 V)
  • V 代表视图(View):负责业务逻辑,并在适当时候调用Model和Template (V+路由 就是 MVC 的 C)

除了以上三层之外,还需要一个URL分发器,它的作用是将一个个URL的页面请求分发给不同的View处理,View再调用相应的Model和Template,MTV的响应模式如下所示:

在这里插入图片描述

一般是用户通过浏览器向我们的服务器发起一个请求(request),这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模版也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模版中的空格中,最后返回页面给用户


Django目录结构

在这里插入图片描述

		django项目目录
		项目同名文件夹
		__init__.py  		很少用 主要做一些冷门配置
		settings.py    		项目的全局配置文件
		urls.py		   		路由文件,写地址的后缀和视图函数的对应关系
		wsgi.py		 		django服务 基本不用
		manage.py			django的启动文件、入口文件
		templates文件夹		模版文件,存储项目所需的html文件
	 	
		应用名文件夹(可以有多个)
		migrations文件夹  	orm相关(数据库打交道的记录)
		__init__.py  		很少用 主要做一些冷门配置
		admin.py		 	django自带的后台管理系统
		apps.py				创建应用之后用于应用的注册
		models.py			模型层,存储与数据库表相关的类
		tests.py			自带的测试文件
		views.py		 	视图文件。存储业务相关的逻辑代码(函数、类)
		db.sqlite3			自带的小型数据库
		
		urls.py				路由层
		views.py			视图层
		templates			模板层
		models.py   		模型层

更多Django基本操作可以去看我的这篇博客https://blog.csdn.net/achen_m/article/details/134296792?spm=1001.2014.3001.5501


Django请求生命周期流程图

在这里插入图片描述

	django的生命周期是从用户发送HTTP请求数据到网站响应的过程。

	整个过程的流程:
	1.首先,用户在浏览器输入一个URL,发送一个请求
	2.在django中有一个封装的socket的方法模块wsgiref,监听端口接收request请求,并且封装传送到中间件中。
	3.在由中间件传输到路由系统中进行路由分发,匹配相对应的视图函数
	4.将reqeust请求传输到视图函数中进行逻辑处理。
	5.调用models中表对象,然后通过ORM操作数据库拿到数据,同时去templates中去相应的模版文件中进行渲染
	6.然后返回到中间件中,进行response响应返回数据到wsgiref中进行封装后再返回给浏览器展示给用户 

路由控制

此处只做补充知识,想看更多可查看我的这篇博客了解https://blog.csdn.net/achen_m/article/details/134377889?spm=1001.2014.3001.5501

路由是什么

URL配置(URLconf)就像Django 所支撑网站的目录。它的本质是URL与要为该URL调用的视图函数之间的映射表;你就是以这种方式告诉Django,对于客户端发来的某个URL调用哪一段逻辑代码对应执行(请求路径和要执行的视图函数的关系)

路由匹配

此处只说2.X版本以上使用的关键字path,想看1.X的可以前去上面标题处的连接

	在django2.x及以上版本:path第一个参数写什么就匹配什么(精准匹配),匹配到直接执行对应的视图函数
		path('admin/',函数名),  '这种写法不支持正则表达式'

	当然2.x版本也有可以使用正则匹配的方式:
		re_path(正则表达式,函数名) '其作用和django1.x的url使用效果一模一样'
		'但是因为有转换器,基本就用不上re_path这个关键字,而且正则匹配本就不是那么的安全'

path的详细使用

	urlpatterns = [
	    path('admin/', views.admin),
	]
	等价于:_path(route, view, kwargs=None, name=None)
	第一个参数:
		精准路径,字符串
		可以使用转换器:'<int:pk>'  '<str:name>'
		例子:
			path('index/<int:year>/<str:info>/',views.index)
			转换器有几个名字,那么视图函数的形参就必须对应
			视图层:
			def index(request,year,info):
			    print(year,info)
			    return HttpResponse('from index')
			    
	第二个参数:视图函数的内存地址,不要加括号
		1.路由一旦匹配成功,就会执行,你写的这个视图函数(request),并且会把request对象传入
		2.如果有分组的参数[有名分组、无名分组],或者转换器的参数,都会被传递到视图函数中作为参数
		'''
		总结:需要放视图函数内存地址------》视图函数的第一个参数是固定的,必须是reqeust,后续的参数取决于
		写没写转换器或者写没写有名分组、无名分组
		'''
	
	第三个参数:kwargs 是给视图函数传递默认参数
	第四个参数:是路径的别名---》主要用于反向解析得到该路径

re_path除了第一个参数不一样以外,其他完全和path是一样的。re_path第一个参数是正则表达式

现在基本很少使用re_path,因为危险性比较大,原来之所以使用就是为了使用正则匹配分组出参数,现在path可以通过转换器就能完成这个操作,所以基本不使用re_path


反向解析

在使用Django 项目时,一个常见的需求是获得URL 的最终形式,以用于嵌入到生成的内容中(视图中和显示给用户的URL等)或者用于处理服务器端的导航(重定向等)。人们强烈希望不要硬编码这些URL(费力、不可扩展且容易产生错误)或者设计一种与URLconf 毫不相关的专门的URL 生成机制,因为这样容易导致一定程度上产生过期的URL。

反向解析为的就是防止路由经常变动,这样我们页面的链接、或者函数的重定向就能动态获取到路由可接收的URL。

此处也仅用path来讲述

	'反向解析,用于视图函数中、用于模版中'
	
	1.没有转换器的情况:
		path('index/', views.index,name='index'),
		'视图函数'
		from django.shortcuts import HttpResponse,reverse
		def index(request):
			reverse('index') # 定义路径传入的name参数对应的字符串
			
	2.有转化器的情况:
		path('index/<str:name>', views.index,name='index'),
		'视图函数'
		from django.shortcuts import HttpResponse,reverse
		def index(request):
			reverse('index',kwargs={'name':'jack'})
		'最后生成的路径:URL/index/jack'

路由分发

django是专注于开发应用的,当一个django项目特别庞大的时候所有的路由与视图函数映射关系全部写在总的urls.py很明显太冗余不便于管理,其实django中的每一个app应用都可以有自己的urls.py、static文件夹、templates文件夹,基于上述特点,使用django做分组开发非常的简便。

可以分开写多个app应用,最后再汇总到一个空的Django项目然后使用路由分发将多个app应用关联起来。

未使用路由分发前:所有请求都由主路由转发到对应视图函数,全部都在一个urls.py文件内。

为什么默认路由匹配能匹配到urls.py文件呢?是因为在settings配置文件中配置了ROOT_URLCONF = 'django_项目名.urls'

	路由分发需要使用到关键字include
	from django.urls. import path,include
	主路由:
		urlpatterns = [
		    path('admin/', admin.site.urls),
		    path('app01/', include('app01.urls')),
		]

	然后需要再应用里面建立一个urls.py文件
	充当子路由
	from django.urls import path
	from app01 import views
	
	urlpatterns = [
	    path('index/',views.index),
	]

视图层

django视图层:Django项目下的views.py文件,它的内部是一系列的函数或者是类,用来处理客户端的请求后处理并返回相应的数据

视图层,熟练掌握两个对象即可:请求对象(request)和响应对象(HttpResponse)

视图函数语法

	'视图函数必须要有一个reqeust参数,并且必须要返回一个HttpResponse对象'
	def index(reqeust):
		return HttpResponse('hello,world')

reqeust对象属性

django将请求报文中的请求行、首部信息、内容主体封装成 HttpRequest 类中的属性。 除了特殊说明的之外,其他均为只读的

	'它是http请求(数据包----》字符串形式)-----》拆分成了django中的reqeust对象'

	request对象常用的属性:
		request.GET		一个类似于字典的对象,包含 HTTP GET 的所有参数。详情请参考 QueryDict 对象。
		reqeust.POST	一个类似于字典的对象,如果请求中包含表单数据,则将这些数据封装成 QueryDict 对象。
		
		reqeust.body	
		一个字符串,代表请求报文的主体。在处理非 HTTP 形式的报文时非常有用,例如:二进制图片、XML,Json等。
  	但是,如果要处理表单数据的时候,推荐还是使用 HttpRequest.POST 。

		request.path 	一个字符串,表示请求的路径组件(不含域名)。例如:"/music/bands/the_beatles/"
		request.method	一个字符串,表示请求使用的HTTP 方法。必须使用大写。例如:"GET""POST"
		reqeust.FILES	一个类似于字典的对象,包含所有的上传文件信息。

	request对象不常用的属性:
		request.cookie
		reqeust.session
		reqeust.content_type:提交的编码格式:'urlencoded(form表单),json,form-data,text/plain(一般不用,浏览器默认格式)'
		reqeust.META:请求头中的数据
			 一个标准的Python 字典,包含所有的HTTP 首部。具体的头部信息取决于客户端和服务器,下面是一些示例:
			  取值:
			
			    CONTENT_LENGTH —— 请求的正文的长度(是一个字符串)。
			    CONTENT_TYPE —— 请求的正文的MIME 类型。
			    HTTP_ACCEPT —— 响应可接收的Content-Type。
			    HTTP_ACCEPT_ENCODING —— 响应可接收的编码。
			    HTTP_ACCEPT_LANGUAGE —— 响应可接收的语言。
			    HTTP_HOST —— 客服端发送的HTTP Host 头部。
			    HTTP_REFERER —— Referring 页面。
			    HTTP_USER_AGENT —— 客户端的user-agent 字符串。
			    QUERY_STRING —— 单个字符串形式的查询字符串(未解析过的形式)。
			    REMOTE_ADDR —— 客户端的IP 地址。
			    REMOTE_HOST —— 客户端的主机名。
			    REMOTE_USER —— 服务器认证后的用户。
			    REQUEST_METHOD —— 一个字符串,例如"GET""POST"。
			    SERVER_NAME —— 服务器的主机名。
			    SERVER_PORT —— 服务器的端口(是一个字符串)。
			   从上面可以看到,除 CONTENT_LENGTH 和 CONTENT_TYPE 之外,请求中的任何 HTTP 首部转换为 META 的键时,
			    都会将所有字母大写并将连接符替换为下划线最后加上 HTTP_  前缀。
			    所以,一个叫做 X-Bender 的头部将转换成 META 中的 HTTP_X_BENDER 键。
	
				'''
				用户自定义写的例如:name=jack
				取:request.META.get('HTTP_NAME')  # 前面加上HTTP_把自定义的转成大写
				'''

reqeust对象方法

1.HttpRequest.get_full_path()

  返回 path,如果可以将加上查询字符串。

  例如:"/music/bands/the_beatles/?print=true"
  注意和path的区别:http://127.0.0.1:8001/order/?name=lqz&age=10


2.HttpRequest.is_ajax()
  如果请求是通过XMLHttpRequest 发起的,则返回True,方法是检查 HTTP_X_REQUESTED_WITH 
  相应的首部是否是字符串'XMLHttpRequest'。

  大部分现代的 JavaScript 库都会发送这个头部。如果你编写自己的 XMLHttpRequest 调用(在浏览器端),
  你必须手工设置这个值来让 is_ajax() 可以工作。

  如果一个响应需要根据请求是否是通过AJAX 发起的,并且你正在使用某种形式的缓存例如Django 的 cache middleware,
   你应该使用 vary_on_headers('HTTP_X_REQUESTED_WITH') 装饰你的视图以让响应能够正确地缓存。

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

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

相关文章

案例-某乎参数x-zse-96逆向补环境

文章目录 前言一、流程分析二、导出代码三、补环境总结 前言 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则…

Java代码的编译与执行过程

一、编译过程 1、javac 编译 Java源代码通过编译器&#xff08;javac&#xff09;编译为字节码文件(.class)。 idea中的 build 和 maven package等指令都可以编译为 .class 2、类加载器(Class Loader) 类加载器负责将类的字节码文件加载到内存中&#xff0c;以便在运行时创…

【RTP】5:从network收到rtp包到组帧之间的数据传递

m79 代码。从网络中收到rtp、rtcp 后交给call 进行处理这是因为call 具有PacketReceiver 的能力。收到的包是一个 :CopyOnWriteBuffer 类型:rtc::CopyOnWriteBuffer packetclass Call PacketReceiver 准备delivery包:返回delivery结果:}成功、包错误、ssrc未知 D:\zhb-dev\…

96.STL-遍历算法 transform

目录 transform 语法&#xff1a; 功能描述&#xff1a; 函数原型&#xff1a; 代码示例&#xff1a; transform 是 C 标准模板库&#xff08;STL&#xff09;中的一个算法&#xff0c;用于对一个范围内的元素进行转换并将结果存储到另一个范围。以下是简要解释和一个示例…

Ansys Lumerical|带 1D-2D 光栅的出瞳扩展器

附件下载 联系工作人员获取附件 此示例显示了设置和模拟出瞳扩展器 &#xff08;EPE&#xff09; 的工作流程&#xff0c;EPE 是波导型增强现实 &#xff08;AR&#xff09; 设备的重要组成部分。该工作流程将利用 Lumerical 和 Zemax OpticStudio 之间的动态链接功能 。为了…

「计算机网络」Cisco Packet Tracker计算机网络仿真器的使用

介绍 Cisco Packet Tracker&#xff1a;网络仿真工具&#xff0c;用于模拟网络配置。 &#xff08;一&#xff09;通过 带外管理 配置交换机&#xff08;Switch&#xff09; 带外&#xff1a;Out-of-Band, OOB写在前面&#xff1a;如何打开Console页面 1、模式转换 用户执行模…

绝对是全网最简单的git入门了!!!

git使用步骤&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff09;&#xff1a; 下载git安装包&#xff1a; https://gitee.com/lihutao/go/blob/master/Git-2.40.0-64-bit.zip 或去官网下载&#xff1a;Git - Downloads 安装完成后在电脑桌面&#xff08;也可…

合并区间[中等]

一、题目 以数组intervals表示若干个区间的集合&#xff0c;其中单个区间为intervals[i] [starti, endi]。请你合并所有重叠的区间&#xff0c;并返回一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间。 示例 1&#xff1a; 输入&#xff1a;intervals […

Vscode中字符串报错:Unknown word.cSpell

一. 报错现象 二. 原因 是vscode IDE工具中的插件 Code Spell Checker 会检查字符串的合理性&#xff0c;我们写的中式拼音的字符串&#xff0c;不是一个标准英文单词&#xff0c;就会提示错误&#xff0c;解决方法就是让该插件遇到特定词汇不报错 三. 解决方法

深入Android S (12.0) 探索Framework之输入系统IMS的构成与启动

文章目录 前言一、输入系统的基本组成部分二、输入系统相关源码分析1、IMS 构建1.1、SystemServer # startOtherServices()1.2、InputManagerService1.3、NativeInputManager # nativeInit()1.4、NativeInputManager1.5、InputManager1.6、InputDispatcher1.7、InputReader1.8、…

Vue路由嵌套和携带参数的几种方法

1、路由嵌套 路由嵌套逻辑&#xff1a; router.index.js中使用children嵌套子路由 //该文件专门用于创建整个文件的路由器 import VueRouter from vue-routerimport About from "/pages/About"; import Home from "/pages/Home"; import News from "…

蓝桥杯物联网竞赛_STM32L071_5_串口接收发送数据

理论&#xff1a; 串口采取异步通信&#xff0c;即不依赖时钟节拍来接收或发送数据&#xff0c;而是采用互相约定的波特率传输数据。 波特率与单位时间传输的比特数有关&#xff0c;波特率越大传输的数据越多 传输一个比特花费的时间T 1 / 比特率 接受和发送数据的时候需要…

vue中的插槽用法(动态插槽)

vue中提供了一种通讯方式叫插槽>分为&#xff1a;默认插槽、具名插槽(作用域插槽) 1. 当一个组件有不确定的结构时, 就需要使用slot技术了 2. 注意: 插槽内容是在父组件中编译后, 再传递给子组件 3. 如果决定结构的数据在父组件, 那用默认slot或具名slot (1) 当只有一个不…

WPF创建进度条

使用wpf做一个原生的进度条&#xff0c;进度条上面有值&#xff0c;先看效果。 功能就是点击按钮&#xff0c;后台处理数据&#xff0c;前台显示处理数据的变化&#xff0c;当然还可以对进度条进行美化和关闭的操作&#xff0c;等待后台处理完毕数据&#xff0c;然后自动关闭。…

OPENWRT路由配置IPV6公网访问

前提&#xff1a;已经拥有ipv6地址&#xff0c;不会配置ipv6的同学可以看我的上一篇文章。 一、光猫配置 1.1、修改光猫连接方式变为桥接&#xff1a; 其中需要注意的点为&#xff1a; 1.需要将原先的xxxx_VID_41的连接删掉&#xff0c;然后按照下面的配置进行 2.删掉之前…

相关性分析和作图

相关的类型 1. Pearson、Spearman和Kendall相关 Pearson 积差相关系数衡量了两个定量变量之间的线性相关程度。&#xff08;连续&#xff09; Spearman等级相关系数则衡量分级定序变量之间的相关程度。&#xff08;分类&#xff09; Kendall’s Tau 相关系数也是一种非参数的…

数据结构 | 查找

基本概念 关键字&#xff1a;数据元素中唯一标识该元素的某个数据项的值&#xff0c;使用基于关键字的查找&#xff0c;查找结果应该是唯一的。例如&#xff0c;在由一个学生元素构成的数据集合中&#xff0c;学生元素中“学号”这一数据项的值唯一地标识一名学生。 查找表&a…

【深入解析git和gdb:版本控制与调试利器的终极指南】

【本节目标】 1. 掌握简单gdb使用于调试 2. 学习 git 命令行的简单操作, 能够将代码上传到 Github 上 1.Linux调试器-gdb使用 1.1.背景 程序的发布方式有两种&#xff0c;debug模式和release模式release模式不可被调试&#xff0c;debug模式可被调试Linux gcc/g出来的二进制…

钉钉直播不了检查防火墙配置没有拦截应用测试直通都放行的,电脑还可以ping通直播域名,就是开始不了直播

环境: 防火墙 AF8.0.17 Win10 专业版 问题描述: 钉钉直播不了检查防火墙配置没有拦截应用测试直通都放行的,电脑还可以ping通直播域名,就是开始不了直播 钉钉直播不了 不能直播电脑电脑可以ping通直播域名 防火墙查了3个域名都没有拦截,AF测试应用直通都放行的 解…

CSS问题:如何实现瀑布流布局?

前端功能问题系列文章&#xff0c;点击上方合集↑ 序言 大家好&#xff0c;我是大澈&#xff01; 本文约2500字&#xff0c;整篇阅读大约需要4分钟。 本文主要内容分三部分&#xff0c;如果您只需要解决问题&#xff0c;请阅读第一、二部分即可。如果您有更多时间&#xff…