【Python高级365】python静态Web服务器

embedded/2024/12/27 7:30:18/

[[340-python网络编程]]+[[330-HTML基础(前端)]]+[[331-CSS基础(前端)]] = Web开发

我们在使用网页的时候,不是服务端和客户端之间互相发信息,而是通过浏览器向服务器通信,交互的数据不仅仅有文字,还有图片、音频、视频等(超文本)

学HTTP协议是为了能自己搭建一个Web服务器

浏览器访问网站的流程

  1. 域名解析
    • 当用户在浏览器中输入 “www.baidu.com” 后,浏览器首先会检查自身的缓存,看是否已经有对应的 IP 地址记录。如果缓存中没有,浏览器会向操作系统发送域名解析请求。操作系统也会先检查自己的缓存(如 DNS 缓存),若没有找到,就会向本地域名服务器(通常由互联网服务提供商 ISP 提供)发送 DNS(Domain Name System)查询请求。
    • 本地域名服务器会在自己的数据库中查找,如果没有找到对应的 IP 地址,它会向根域名服务器发送请求。根域名服务器会根据请求的顶级域名(如.com),将请求转发给对应的顶级域名服务器。顶级域名服务器再根据二级域名(如 baidu),将请求转发给授权域名服务器。授权域名服务器会返回 “www.baidu.com” 对应的 IP 地址(例如,假设是 14.215.177.38)给本地域名服务器,本地域名服务器再将这个 IP 地址返回给操作系统,操作系统最后将 IP 地址传递给浏览器。
  2. 建立 TCP 连接
    • 浏览器得到百度服务器的 IP 地址后,会使用 HTTP 协议(超文本传输协议)通过 TCP(传输控制协议)来建立与百度服务器的连接。浏览器会随机选择一个本地端口(如 1024 - 65535 之间的一个端口,假设是 50000),然后向百度服务器的 HTTP 服务端口(通常是 80 端口,对于加密的 HTTPS 则是 443 端口,这里以 HTTP 为例)发送一个 TCP 连接请求(SYN 包)。
    • 百度服务器收到请求后,会回复一个包含确认号(ACK)和自己的序列号(SYN)的数据包(SYN + ACK 包)。浏览器收到这个包后,会再发送一个确认包(ACK 包),完成三次握手,此时 TCP 连接建立成功。
  3. 发送 HTTP 请求
    • 连接建立后,浏览器会构建一个 HTTP 请求,这个请求包含请求行(如 GET / HTTP/1.1,表示使用 GET 方法请求根目录,HTTP 协议版本是 1.1)、请求头(包含如 User - Agent(浏览器类型和版本)、Accept - Language(接受的语言)等信息)和一个空行(用于分隔请求头和请求体)。如果是 POST 请求,请求体中还会包含要提交的数据。
    • 浏览器将这个 HTTP 请求通过已经建立的 TCP 连接发送给百度服务器
  4. 服务器处理请求并返回响应
    • 百度服务器收到浏览器的 HTTP 请求后,Web 服务器软件(如 Apache、Nginx 等)会对请求进行处理。它会根据请求的内容(如请求的是网页、图片还是其他资源)在服务器的文件系统或数据库中查找对应的资源。
    • 如果找到资源,服务器会构建一个 HTTP 响应。响应包含响应行(如 HTTP/1.1 200 OK,表示协议版本是 1.1,状态码是 200,表示请求成功,状态信息是 OK)、响应头(包含如 Content - Type(内容类型,如 text/html 表示是 HTML 文档)、Content - Length(内容长度)等信息)和响应体(实际的网页内容或其他资源数据)。然后将这个 HTTP 响应通过 TCP 连接发送回浏览器。
  5. 浏览器解析并显示内容
    • 浏览器收到百度服务器返回的 HTTP 响应后,首先会检查响应行的状态码。如果状态码是 200,表示请求成功,浏览器会根据响应头中的 Content - Type 等信息来解析响应体中的内容。
    • 对于 HTML 内容,浏览器会开始解析 HTML 标签,下载并解析 CSS 样式表和 JavaScript 脚本,构建网页的文档对象模型(DOM),并根据 CSS 样式进行渲染,最终将网页内容显示给用户。如果响应中还包含其他资源(如图片、CSS 文件、JavaScript 文件等),浏览器会根据资源的 URL 再次发送 HTTP 请求来获取这些资源,重复上述流程,直到整个网页及其相关资源都被正确显示。
  6. 关闭 TCP 连接
    • 当浏览器完成网页内容的获取和显示后,它可能会选择关闭与百度服务器的 TCP 连接。浏览器会发送一个 FIN 包来请求关闭连接,百度服务器收到后会回复一个 ACK 包确认关闭请求,然后百度服务器也会发送一个 FIN 包,浏览器收到后再回复一个 ACK 包,完成四次挥手,TCP 连接正式关闭。

HTTP协议

1、HTTP 协议的介绍

  • HTTP协议的全称是(HyperTextTransferProtocol),翻译过来就是超文本传输协议
  • 超文本是超级文本的缩写,是指超越文本限制或者超链接,比如:图片、音乐、视频、超链接等等都属于超文本。(理论上任意类型的数据都能传)
  • HTTP协议的制作者是蒂姆·伯纳斯-李(物理学家),1991年设计出来的,HTTP协议设计之前目的是传输网页数据的,现在允许传输任意类型的数据
  • 传输HTTP协议格式的数据是基于TCP传输协议的,发送数据之前需要先建立连接

2、HTTP的作用

HTTP规定了浏览器和Web服务器通信数据的格式,也就是说浏览器和web服务器通信需要使用http协议。

3、浏览器访问Web服务器的通信过程

七个步骤:

  1. 通过DNS解析域名,获取服务器的IP地址
  2. 返回IP地址
  3. 通过IP地址和端口号,建立TCP连接
  4. 发送HTTP请求报文数据(GET、POST请求,默认发送到服务器的80端口
  5. 获取请求资源,图片、网页、视频、音乐等
  6. 把请求数据传递给Web服务器
  7. 返回HTTP响应数据给客户端浏览器

![[361-HTTP协议_image.png]]

查看HTTP协议的通信过程

掌握:
http如何去服务器请求资源
http协议如何相应数据

开发者工具的使用

大部分浏览器里按f12(苹果用alt+command+i),打开开发者工具,点击network,可以看到http请求的通信过程。

控制台中可以看到

  • 元素:查看网页的html结构
  • 控制台:用于写js代码调试
  • 网络:查看http请求的通信过程
  • 源代码:查看网页的源代码

URL

1、URL的概念(俗称的网址)

URL的英文全拼是(UniformResoureLocator),表达的意思是统一资源定位符,通俗理解就是网络资源地址,也就是我
们常说的网址。

2、URL的组成部分

URL的样子:
https://news.163.c0m/18/1122/10/E178J204000189FH.html

URL的组成部分:
①协议部分:https://、http://、ftp:// (网站访问一般使用https协议,使用443端口,http协议使用80端口,ftp协议使用21端口)
②域名部分:news.163.com=>转换为IP地址(有了IP地址就能找到这个计算机)(中国卖域名的网站:万网、阿里云)
③资源路径部分:/18/1122/10/E178J2O4000189FH.html

3、域名与URL扩展

域名:
域名就是IP地址的别名,它是用点进行分割使用英文字母和数字组成的名字,使用域名目的就是方便的记住某台主机IP
地址。
·URL的扩展:
https://news.163.com/hello.html?page=1&count=10
查询参数部分:?page=1&count=10
参数说明:
?后面的page表示第一个参数,后面的参数都使用&进行连接
意义:查询第一页,查询10条数据

报文分为请求和响应两种

HTTP请求报文

get请求用于获取服务器端数据
post请求用于将数据发送到服务器

GET请求报文

标头(请求头)

  • HTTP请求:
    • 请求网址:http://www.baidu.com/
    • 请求方法:GET
    • 状态代码:304 OK
    • 远程地址:127.0.0.1
  • 请求标头:HTTP请求头信息(隐藏携带)
    • accept: text/html,…(浏览器可以接收的文件类型)
    • accept-encoding: gzip, deflate, br(浏览器可以接收的压缩方式)
    • accept-language: zh-CN,zh;q=0.9(浏览器可以接收的语言)
    • cache-control: max-age=0(浏览器可以接收的缓存控制)
    • connection: keep-alive(浏览器可以接收的连接方式)
    • cookie: (浏览器可以接收的cookie,用于保存用户信息)
    • host: www.baidu.com(浏览器可以接收的host)
    • user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36(浏览器可以接收的user-agent(浏览器信息))

GET请求报文格式

  • 请求行:请求方法、请求网址、请求协议
  • 请求头:请求头信息
  • 空行:空行

例如:

---请求行---
GET/wp-content/uploads/2020/12/zm.svgHTTP/1.1#GET请求方式请求资源路径HTTP协议版本
---请求头---
Host: www.itcast.cnn#服务器的主机地址和端口号,默认是80
Connection:keep-alive#和服务端保持长连接
Upgrade-Insecure-Requests:1#让浏览器升级不安全请求,使用https请求
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac 0S X 10_12_4) AppleWebKit/537.36
(KHTML,1ikeGecko)Chrome/69.0.3497.100Safari/537.36#用户代理,也就是客户端的名称
Accept:
text/html, application/xhtml+xml,application/xml;q=0.9, image/webp, image/apng, */*;q=0.8
#可接受的数据类型
Accept-Encoding:gzip,deflate #可接受的压缩格式
Accept-Language:zh-CN,zh;q=0.9#可接受的语言
Cookie:pgV_pvi=1246921728;#登录用户的身份标识
---空行---

POST请求报文

POST请求报文组成:

  • 请求行:请求方法、请求网址(资源路径)、请求HTTP协议版本
  • 请求头:请求头信息
  • 空行:空行
  • 请求体:请求体信息

post请求报文的栗子:

--- 请求行 ---
POST /wp-content/uploads/2020/12/zm.svg HTTP/1.1#POST请求方式请求资源路径HTTP协议版本
--- 请求头 ---
Host: www.itcast.cnn#服务器的主机地址和端口号,默认是80
Connection:keep-alive#和服务端保持长连接
Upgrade-Insecure-Requests:1#让浏览器升级不安全请求,使用https请求
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac 0S X 10_12_4) AppleWebKit/537.36
(KHTML,1ikeGecko)Chrome/69.0.3497.100Safari/537.36#用户代理,也就是客户端的名称
Accept:
text/html, application/xhtml+xml,application/xml;q=0.9, image/webp, image/apng, */*;q=0.8
#可接受的数据类型
Accept-Encoding:gzip,deflate #可接受的压缩格式
Accept-Language:zh-CN,zh;q=0.9#可接受的语言
Cookie:pgV_pvi=1246921728;#登录用户的身份标识
--- 空行 ---
--- 请求体 --- (请求体是请求报文的一部分,用于发送数据到服务器端)
username=admin&password=123456#请求体信息

总结

  • 一个HTTP请求可以由请求行、请求头、空行、请求体组成
  • 请求行是由三部分组成:
    • 请求方法:GET、POST
    • 请求网址:http://www.baidu.com/
    • 请求HTTP协议版本:HTTP/1.1
  • GET方式的请求报文没有请求体,只有请求行和请求头和空行
  • POST方式的请求报文有请求行、请求头、空行、请求体,当然允许没有请求体,只是很少见

HTTP响应报文

响应报文需要携带文本、图片、视频、音频等数据
所以在返回数据的时候就要把你的数据组装成一个响应报文

组成:

  • 响应行(response line):响应状态码(404)、响应状态描述(OK/NOT FOUND)
  • 响应头(response header):响应头信息
    • server:apache # 服务器名称
    • content-type:text/html;charset=utf-8 # 响应体数据类型
  • 空行
  • 响应体(response body):响应体信息

HTTP常见相应状态码

  • 200:请求成功
  • 301:永久重定向
  • 302:临时重定向
  • 400:请求错误
  • 404:请求的资源不存在
  • 500:服务器内部错误
  • 502:网关错误
  • 503:服务不可用
  • 504:网关超时

使用python自带的http.server模块,可以快速搭建一个简单的静态Web服务器

静态Web服务器是什么?

  • 静态Web服务器:只返回静态资源,不返回动态资源
  • 动态Web服务器:返回动态资源,动态资源是指根据请求参数的不同,返回不同的资源

快速搭建一个简单的静态Web服务器

①创建一个index.html文件:

为什么是index.html?

  • 因为浏览器默认访问的是index.html

index.html文件内容:

<h1>Hello, World!</h1>
<p>这是一个简单的静态Web服务器</p>

②切换到index.html文件所在目录,执行以下命令:

python -m http.server 8080  # python的web服务器不指定端口,默认是8000

③在浏览器中访问http://127.0.0.1:8080/index.html,可以看到index.html文件的内容

无法访问的常见原因:

  • 端口被占用
  • 浏览器缓存
  • 防火墙
  • 网页路径没有访问权限,需要管理员权限才能访问

http://www.ppmy.cn/embedded/149120.html

相关文章

太阳能LED路灯智能控制系统(论文+源码)

1系统的功能及方案设计 本次课题为太阳能LED路灯智能控制系统&#xff0c;其系统整体架构如图2.1所示&#xff0c;太阳能板通过TP4056充电模块给锂电池进行充电&#xff0c;电池通过HX3001升压模块进行升压到5V给整个控制系统进行供电&#xff0c;控制系统由AT89C52单片机作为…

闯关leetcode——3168. Minimum Number of Chairs in a Waiting Room

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/minimum-number-of-chairs-in-a-waiting-room/description/ 内容 You are given a string s. Simulate events at each second i: If s[i] ‘E’, a person enters the waiting room and takes …

学习笔记(prism--视频【WPF-prism核心教程】)--待更新

《一》框架介绍 prism是一个用于WPF…和winUI中构建的松散耦合&#xff0c;可维护和可测试的应用程序框架。帮助WPF开发人员以简化编写&#xff0c;维护和扩展来设计应用程序。 优点&#xff1a;遵循特定的约定&#xff0c;可自动将view/ViewModel建立DataContext的关系&#…

SpringCloudAlibaba技术栈-Dubbo

1、什么是Dubbo? 简单来说&#xff0c;dubbo就像是个看不见的手&#xff0c;负责专门从注册中心nacos调用注册到nacos上面的服务的&#xff0c;因为在微服务环境下不同的功能模块可能在不同的服务器上。dubbo调用服务就像是在调用本地的服务一样。 分布式调用与高并发处理 Du…

在算力魔方上运行Genesis:一款颠覆性开源生成式物理引擎!

作者&#xff1a;算力魔方创始人 刘力 一&#xff0c;Genesis简介 Genesis是一款由19个顶尖科研机构联手打造的&#xff0c;用于通用机器人、具身智能和物理 AI 应用的开源生成式物理引擎。它可以生成整个世界&#xff0c;包括相机运动、机器人任务和交互式 3D 场景等。其特点有…

电脑出现 0x0000007f 蓝屏问题怎么办,参考以下方法尝试解决

电脑蓝屏是让许多用户头疼的问题&#xff0c;其中出现 “0x0000007f” 错误代码更是较为常见且棘手。了解其背后成因并掌握修复方法&#xff0c;能帮我们快速恢复电脑正常运行。 一、可能的硬件原因 内存问题 内存条长时间使用可能出现物理损坏&#xff0c;如金手指氧化、芯片…

【ue5学习笔记2】在场景放入一个物体的蓝图输入事件无效?

在场景放入一个物体的蓝图输入事件无效&#xff0c;那是因为你不知道gameMode这个东西这是一个用于设定游戏股则的东西&#xff0c; 就好比你的控制对象&#xff0c;你输入无效是没有指定你当前关卡中指定的控制对象是它。操作方法如下&#xff1a; 1.创建一个gameMode蓝图类并…

嵌入式学习-QT-Day04

嵌入式学习-QT-Day04 四、基本组件 1、Designer设计师 2、布局Layout 3、QWidget类 4、界面文件与C代码的关系 5、QLabel标签 5.1 基本属性 5.2 添加资源库 5.3 使用资源库 5.4 使用代码添加图片 5.5 使用代码添加动态图 6、QAbstractButton按钮类 7、QLineEdit 单行文本输入框…