做餐饮网站建设,网络工程师好学吗,诚信通网站怎么做外链,大良用户网站建设Django 底层原理快捷键方向键方向键本键如果活动选项是选项按钮或文件则为移动焦点#xff1b;方向键 Win键(简称Win键)使窗口全屏、最小化、靠左半边、靠右半边(部分版本不支持)#xff1b;方向键Shift键将连续的文字或文件选中方向键(左右)Ctrl键 在英文单词或中文词语间跳…Django 底层原理快捷键方向键方向键本键如果活动选项是选项按钮或文件则为移动焦点方向键 Win键(简称Win键)使窗口全屏、最小化、靠左半边、靠右半边(部分版本不支持)方向键Shift键将连续的文字或文件选中方向键(左右)Ctrl键 在英文单词或中文词语间跳跃方向键(上下)Ctrl键 在段落开头间跳跃按Home(定位到行首)然后按ShiftEnd(行尾)或者 然后按Shift↓ (下一行这个位置)或者 按End(定位到行尾)然后按ShiftHomectrlCtrlb 粗体 BoldCtrle 居中对齐 EncenterCtrlf 查找 FindCtrlh 替换 HuanCtrlk 超级链接 King LinkwinWin键E打开Windows资源管理器Explorer【即我的电脑、计算机】Win键R运行Win键ShiftSWindows 自带截图win键PrtScSysRq键 快速截屏HTTP超文本传输协议(英文HyperText Transfer Protocol缩写HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网WEB的数据通信的基础。现今广泛使用的一个版本——HTTP 1.1(已更新至2.0)HTTP工作原理HTTP协议定义Web客户端如何从Web服务器请求Web页面以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。响应报文比如HTTP/1.1 200 OK以下是 HTTP 请求/响应的步骤客户端连接到Web服务器一个HTTP客户端通常是浏览器与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如http://www.luffycity.com。发送HTTP请求通过TCP套接字客户端向Web服务器发送一个文本的请求报文一个请求报文由请求行、请求头部、空行和请求数据4部分组成。服务器接受请求并返回HTTP响应Web服务器解析请求定位请求资源。服务器将资源复本写到TCP套接字由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。释放连接TCP连接若connection 模式为 close(无连接)则服务器主动关闭TCP连接客户端被动关闭连接释放TCP连接;若 connection 模式为 keepalive(短连接)则该连接会保持一段时间在该时间内可以继续接收请求;客户端浏览器解析HTML内容客户端浏览器首先解析状态行查看表明请求是否成功的状态代码。然后解析每一个响应头响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML根据HTML的语法对其进行格式化并在浏览器窗口中显示。例如在浏览器地址栏键入URL按下回车之后会经历以下流程浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;域名(英语Domain Name)又称网域是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称用于在数据传输时对计算机的定位标识(有时也指地理位置)。由于IP地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点人们设计出了域名并通过域名服务器(DNSDomain Name System)来将域名和IP地址相互映射使人更方便地访问互联网而不用去记住能够被机器直接读取的IP地址数串。解析出 IP 地址后根据该 IP 地址和默认端口 80和服务器建立TCP连接;浏览器发出读取文件(URL 中域名后面部分对应的路径(文件))的HTTP 请求该请求报文作为 TCP 三次握手中第三次握手(由客户端发送)时的报文数据发送给服务器;服务器对浏览器请求作出响应并把对应的 html 文本发送给浏览器;释放 TCP连接;浏览器将该 html 文本渲染并显示内容;HTTP特点基于 请求-响应 的模式HTTP协议规定请求从客户端发出最后服务器端响应该请求并返回。换句话说肯定是先从客户端开始建立通信的服务器端在没有接收到请求之前不会发送响应无状态保存概念HTTP是一种不保存状态,即无状态(stateless)协议即HTTP协议自身不对请求和响应之间的通信状态进行保存。只要连接中断就撤销当前所有信息即每次开始时都是个完全空白的状态目的为了更快地处理大量事务,确保协议的可伸缩性,而特意把HTTP协议设计成如此简单的。弊端信息的不存储对于必须要存储某些信息的网站来说意味着我输入一个网页并回车一个套接字返回我要访问的html然后他就走了然后当我要进行登陆操作时又来了一个套接字接待我给我返回登陆的网页然后他也走了。我在输入完信息后回车进行登陆又一个套接字过来拿着我的请求中的信息去数据库里进行比对检验完后它就走了临走前返回我一个登陆成功这时如果我要进行基于用户的操作时一个新的套接字过来说你还没登陆啊怎么能进行这个操作我....基于上述情况cookie由此诞生。无连接概念无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求并收到客户的应答后即断开连接。目的采用这种方式可以节省传输时间并且可以提高并发性能不能和每个用户建立长久的连接请求一次响应一次服务端和客户端就中断了。优势适用于重浏览型网页腾出线程来接待新用户防止占用套接字不发请求的用户。短连接概念HTTP/1.1 版本之后采用的是短连接的方式即套接字响应完后不会马上关闭而是等待几秒钟的时间(程序员可以自行设定)如果客户端在这段时间内没有响应的话才会断开。目的这样做的主要目的还是为了节省时间因为重新创建套接字也是需要时间的目前默认3s左右。对于一个连续操作的客户端来说如果他在短时间内点击了html中的很多选项这样每次服务器都需要创建一个套接字来接待他仅创建套接字的时间就足以拖垮效率。而对于一个操作间隔很长的客户端来说无连接很明显是个足够优秀的选择短连接等待时间网站根据自己网站用户的行为来分析统计出一个最优的等待时间。优势适用于强操作性网页可以防止单个用户短时间就占用多个套接字(因为无连接的方式套接字响应完请求就自行关闭了所以新的请求就要重新建立套接字)。因此无连接、短连接没有绝对的优劣主要还是看客户端需求。HTTP请求方法get 拿数据post 发数据报文格式请求报文响应报文通过GET方式提交数据时请求数据(页面提交的信息)会放在原路径后并与原路径组成一个新的路径部分因此get方式提交时路径部分不止有路径且后面的请求数据部分一定为空。这种形式还会出现一个问题就是客户端第一次访问服务器时通常是以域名的形式访问的之后就通过点击超链接或敲回车自动转载网页的形式访问服务器的其他页面。上述后者是以URL{域名(或ip)路径}的形式访问服务器的这就意味着页面在访问服务器时域名路径会直接显示在浏览器网址栏即用户的请求数据会以明文形式显示在网址栏这对于用户的个人数据等信息来说是不能接受的。GET方式以?分割路径和请求数据请求数据中的参数之间以相连如EditBook?nametest1id123456.(请求头里面那个content-type做的这种参数形式后面讲) POST方法是把页面提交的数据放在HTTP包的请求数据中。GET提交的数据大小有限制(因为浏览器对URL的长度有限制)而POST方法提交的数据没有限制.GET与POST请求在服务端获取请求数据方式不同就是我们自己在服务端取请求数据的时候的方式不同了这句废话昂。HTTP状态码所有HTTP响应的第一行都是状态行依次是当前HTTP版本号3位数字组成的状态代码以及描述状态的短语彼此由空格分隔。比如HTTP/1.1 200 OK状态代码的第一个数字代表当前响应的类型1xx消息——请求已被服务器接收继续处理2xx成功——请求已成功被服务器接收、理解、并接受(没问题)3xx重定向——需要后续操作才能完成这一请求4xx请求错误——请求含有词法错误或者无法被执行(客户端请求出现问题)5xx服务器错误——服务器在处理某个正确请求时发生错误(服务器出现问题)URL超文本传输协议(HTTP)的统一资源定位符将从因特网获取信息的五个基本元素包括在一个简单的地址中(即一个完整的网页)传送协议(http/https(http基础上进行加密提升安全性))。层级URL标记符号(为[//],固定不变)访问资源需要的凭证信息(可省略)服务器。(通常为域名有时为IP地址)端口号。(以数字方式表示若为HTTP的默认值“:80”可省略)路径。(以“/”字符区别路径中的每一个目录名称第一个/前就是域名(或IP)查询。(GET模式的窗体参数以“?”字符为起点每个参数以“”隔开再以“”分开参数名称与数据通常以UTF8的URL编码避开字符冲突的问题)片段。以“#”字符为起点以http://www.luffycity.com:80/news/index.html?id250page1 为例,其中http是协议www.luffycity.com是服务器80是服务器上的默认网络端口号默认不显示/news/index.html是路径(URI直接定位到对应的资源)?id250page1是查询。大多数网页浏览器不要求用户输入网页中“http://”的部分因为绝大多数网页内容是超文本传输协议文件。同样“80”是超文本传输协议文件的常用端口号因此一般也不必写明。一般来说用户只要键入统一资源定位符的一部分(www.luffycity.com:80/news/index.html?id250page1)就可以了。由于超文本传输协议允许服务器将浏览器重定向到另一个网页地址因此许多服务器允许用户省略网页地址中的部分比如 www。从技术上来说这样省略后的网页地址实际上是一个不同的网页地址浏览器本身无法决定这个新地址是否通服务器必须完成重定向的任务。浏览器对页面进行渲染时需要html文件中通过各种方式引用的所有素材以及网页的图标并且这个过程是以异步的形式向服务器发送请求的(遇到第一个需要的素材就给服务器发请求说我要然后html中的代码继续往下走)rb形式发送文件数据时发送的只有文档里的内容文件的外壳跟名字都没有被发送函数版web框架from threading import Threadimport socketserver socket.socket()server.bind((127.0.0.1,8001))server.listen()def html():with open(home.html, rb) as f:to_client_data f.read()return to_client_datadef css():with open(home.css, rb) as f:to_client_data f.read()return to_client_datadef js():with open(home.js, rb) as f:to_client_data f.read()return to_client_datadef jpg():with open(1.jpg, rb) as f:to_client_data f.read()return to_client_datadef ico():with open(xx1.ico, rb) as f:to_client_data f.read()return to_client_dataurl_patterns [(/,html),(/home.css,css),(/home.js,js),(/1.jpg,jpg),(/favicon.ico,ico),]while 1:conn,addr server.accept()from_client_msg conn.recv(1024).decode(utf-8)# print(from_client_msg)# print(from_client_msg.decode(utf-8))request_path from_client_msg.split( )[1]# 拿到用户的访问路径print(request_path)conn.send(bHTTP/1.1 200 ok\r\n\r\n)for i in url_patterns:if i[0] request_path:# 进行信息比对你要访问的路径在我的url-func关系中就调用对应的函数给他返回对应页面。to_client_data i[1]()conn.send(to_client_data)conn.close()server.close()并发版web框架from threading import Threadimport socketserver socket.socket()server.bind((127.0.0.1,8001))server.listen()def html(conn):with open(home.html, rb) as f:to_client_data f.read()conn.send(to_client_data)conn.close()# return to_client_datadef css(conn):with open(home.css, rb) as f:to_client_data f.read()conn.send(to_client_data)conn.close()def js(conn):with open(home.js, rb) as f:to_client_data f.read()conn.send(to_client_data)conn.close()def jpg(conn):with open(1.jpg, rb) as f:to_client_data f.read()conn.send(to_client_data)conn.close()def ico(conn):with open(xx1.ico, rb) as f:to_client_data f.read()conn.send(to_client_data)conn.close()url_patterns [(/,html),(/home.css,css),(/home.js,js),(/1.jpg,jpg),(/favicon.ico,ico),]while 1:conn,addr server.accept()from_client_msg conn.recv(1024).decode(utf-8)request_path from_client_msg.split( )[1]print(request_path)conn.send(bHTTP/1.1 200 ok\r\n\r\n)for i in url_patterns:if i[0] request_path:target_thread Thread(targeti[1],args(conn,))# to_client_data i[1]()target_thread.start()server.close()# 注意这里不能跟函数web框架一样在循环外关闭套接字、服务器# 因为我的代码里只有一个变量名。通俗点形容当一个客户来访问服务器我就创建一个线程给他个名字叫conn并让她去服务这个客户他俩离开后如果又来一个用户我就再创建一个线程并且把之前那个线程的名字给拿走给这个新的线程但是这样并不影响之前的线程服务用户他俩玩他俩的。# 但当其中一个线程先运行完后他就会执行循环外的conn.close()这时如果正好创建了一个线程把名字也给了但是还没来得及去服务他就被辞职了这时没人服务用户了程序就出错了而且在辞职完conn后还要关门停止营业这就不是我预期的效果了。动态页面版web框架动态页面的意思是同一个url我每次打开时都不同于之前。而非带闪图、动态等重复变化的页面。from threading import Threadimport socketimport timeserver socket.socket()server.bind((127.0.0.1,8001))server.listen()def html(conn):current_time time.time()# import pymysqlwith open(home.html, r,encodingutf-8) as f:to_client_data f.read()to_client_data to_client_data.replace(%xxoo%,str(current_time))conn.send(to_client_data.encode(utf-8))conn.close()# return to_client_datadef css(conn):with open(home.css, rb) as f:to_client_data f.read()conn.send(to_client_data)conn.close()def js(conn):with open(home.js, rb) as f:to_client_data f.read()conn.send(to_client_data)conn.close()def jpg(conn):with open(1.jpg, rb) as f:to_client_data f.read()conn.send(to_client_data)conn.close()def ico(conn):with open(xx1.ico, rb) as f:to_client_data f.read()conn.send(to_client_data)conn.close()url_patterns [(/,html),(/home.css,css),(/home.js,js),(/1.jpg,jpg),(/favicon.ico,ico),]while 1:conn,addr server.accept()from_client_msg conn.recv(1024).decode(utf-8)request_path from_client_msg.split( )[1]print(request_path)conn.send(bHTTP/1.1 200 ok\r\n\r\n)for i in url_patterns:if i[0] request_path:target_thread Thread(targeti[1],args(conn,))# to_client_data i[1]()target_thread.start()server.close()wsgiref版web框架wsgiref模块是对socket的封装其内部的environ是对http信息进行了切割并整理成一个字典想要用户的什么数据只要知道这个数据对应的键名就可以直接拿到了而什么数据对应什么键都是其内部定义好了的所以用起来很方便。Django中也有可以实现wsgiref模块功能的元素也是通过某些功能直接将http信息做好了切割保存通过指定方式去拿指定信息就可以了。from wsgiref.simple_server import make_serverurl_patterns [(/index,index),]def index():with open(html, rb) as f:to_client_data f.read()return to_client_datadef application(environ, start_response)::param environ: 封装了所有的http协议相关信息--一个字典{path_info:/}:param start_response::return:request_path environ[PATH_INFO]# 通过固定键名PATH_INFO直接拿到用户的请求路径for i in url_patterns:if i[0] request_path:ret i[1]()start_response(200 OK, [(k1,v1),])# print(environ)# print(environ[PATH_INFO])return [ret]httpd make_server(127.0.0.1, 8080, application)httpd.serve_forever()B/S概念随着Internet和WWW的流行以往的主机/终端和C/S都无法满足当前的全球网络开放、互连、信息随处可见和信息共享的新要求于是就出现了B/S架构即浏览器/服务器结构。它是C/S架构的一种改进可以说属于三层C/S架构。主要是利用了不断成熟的WWW浏览器技术用通用浏览器就实现了原来需要复杂专用软件才能实现的强大功能并节约了开发成本是一种全新的软件系统构造技术。结构第一层是浏览器即客户端只有简单的输入输出功能处理极少部分的事务逻辑。由于客户不需要安装客户端只要有浏览器就能上网浏览所以它面向的是大范围的用户所以界面设计得比较简单通用。第二层是WEB服务器扮演着信息传送的角色。当用户想要访问数据库时就会首先向WEB服务器发送请求WEB服务器统一请求后会向数据库服务器发送访问数据库的请求这个请求是以 SQL 语句实现的。第三层是数据库服务器他扮演着重要的角色因为它存放着大量的数据。当数据库服务器收到了WEB服务器的请求后会对 SQL 语句进行处理并将返回的结果发送给WEB服务器接下来WEB服务器将收到的数据结果转换为HTML文本形式发送给浏览器也就是我们打开浏览器看到的界面。原理B/S架构采取浏览器请求服务器响应的工作模式。用户可以通过浏览器去访问Internet上由Web服务器产生的文本、数据、图片、动画、视频点播和声音等信息而每一个Web服务器又可以通过各种方式与数据库服务器连接大量的数据实际存放在数据库服务器中从Web服务器上下载程序到本地来执行在下载过程中若遇到与数据库有关的指令由Web服务器交给数据库服务器来解释执行并返回给Web服务器Web服务器又返回给用户。在这种结构中将许许多多的网连接到一块形成一个巨大的网即全球网。而各个企业可以在此结构的基础上建立自己的Internet。在 B/S 模式中用户是通过浏览器针对许多分布于网络上的服务器进行请求访问的浏览器的请求通过服务器进行处理并将处理结果以及相应的信息返回给浏览器其他的数据加工、请求全部都是由Web Server完成的。通过该框架结构以及植入于操作系统内部的浏览器该结构已经成为了当今软件应用的主流结构模式。B/S优缺点B/S架构最大的优点是总体拥有成本低、维护方便、 分布性强、开发简单可以不用安装任何专门的软件就能 实现在任何地方进行操作客户端零维护系统的扩展非常容易只要有一台能上网的电脑就能使用。最大的缺点就是通信开销大、系统和数据的安全性较难保障。C/S与B/S在响应速度用户界面数据安全等方面C/S强于B/S但是在业务扩展和适用 www 条件下B/S明显胜过C/S。可以这么说B/S的强项就是C/S的弱项反之亦然。它们各有优缺点相互无法取代。C/S结构与B/S结构两种模式各自拥有其特色优势在不同的系统环境与操作平台下选择较为接近或交叉进 行混合模式的使用可以保证数据的敏感性、安全性和稳定发展还可以加强对数据库的修改与新增记录的操作。 对客户端程序进行保护提高资源数据的交互性能实现系统维护成本较低、维护方式较简便、布局更合理、网络数据使用效率较高的目的采用C/S与B/S混合模式才是最佳方案。C/S与B/S不同点C/SB/S硬件环境专用网络广域网安全要求面向相对固定的用户群信息安全的控制能力强面向不可知的用户群对安全的控制能力相对较弱程序架构更加注重流程系统运行速度可较少考虑对安全以及访问速度都要多重的考虑是发展趋势软件重用差好系统维护升级难开销小方便升级处理问题集中分散用户接口与操作系统关系密切跨平台与浏览器相关信息流交互性低交互密集