[Python学习篇] Python搭建静态web服务器

Python内置的web静态服务器

Python内置的`http.server`模块可以快速启动一个简单的HTTP服务器。

在Python 3中,打开命令行或终端,在你想要作为静态服务器根目录的文件夹下,运行以下命令:

python -m http.server 8000      

这将会在当前目录启动一个HTTP服务器,监听端口8000,端口可以随意指定。你可以在浏览器中访问 `http://localhost:8000` 查看目录内容。

示例:

浏览器访问静态资源  http://localhost:9000


Python搭建属于自己的web静态服务器

方式一:

使用 socket tcp自己编码的方式。

# server.py
import socket  # socket tcp
import threading  # 多线程
import sys  # 获取命令行输入参数class HttpWerServer:# 初始化TCP套接字,默认端口8000def __init__(self, port=8000):# 创建tcp服务端套接字server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)# 设置端口号复用server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)# 绑定端口号,ip不指定表示使用本机ipserver_socket.bind(("", port))# 设置监听server_socket.listen(128)self.server_socket = server_socket@staticmethoddef handle_client(client_socket):# 接收客户端的请求信息recv_data = client_socket.recv(4096)# 判断接收的数据长度是否为0if len(recv_data) == 0:client_socket.close()return# 对二进制数据进行解码recv_content = recv_data.decode("utf-8")print(recv_content)# 对数据按照空格进行分割,为了拿到资源名称,例如:/abc.htmlrequest_list = recv_content.split(" ", maxsplit=2)# 获取请求的资源路径request_path = request_list[1]print(request_path)# 判断请求的是否是根目录,如果是根目录设置返回的信息if request_path == "/":request_path = "/index.html"# 1. 判断文件是否存在方式一:os.path.exits# os.path.exists("static/" + request_path)# 2. 判断文件是否存在方式二:try-excepttry:# 打开文件读取文件中的数据, 提示:这里使用rb模式,兼容打开图片文件with open("static" + request_path, "rb") as file:file_data = file.read()# 提示: with open 关闭文件这步操作不用程序员来完成,系统帮我们来完成except FileNotFoundError as e:  # 文件不存在异常,返回404# 代码执行到此,说明没有请求的该文件,返回404状态信息# 响应行response_line = "HTTP/1.1 404 Not Found\r\n"# 响应头response_header = "Server: PWS/1.0\r\n"# 读取404页面数据with open("static/error.html", "rb") as file:file_data = file.read()# 响应体response_body = file_data# 把数据封装成http 响应报文格式的数据response = (response_line +response_header +"\r\n").encode("utf-8") + response_body# 发送给浏览器的响应报文数据client_socket.send(response)else:# 代码执行到此,说明文件存在,返回200状态信息# 响应行response_line = "HTTP/1.1 200 OK\r\n"# 响应头response_header = "Server: PWS/1.0\r\n"# 响应体response_body = file_data# 把数据封装成http 响应报文格式的数据response = (response_line +response_header +"\r\n").encode("utf-8") + response_body# 发送给浏览器的响应报文数据client_socket.send(response)finally:# 关闭服务于客户端的套接字client_socket.close()def start(self):print("静态web服务器启动...")# 循环等待接受客户端的连接请求while True:# 等待接受客户端的连接请求client_socket, client_address = self.server_socket.accept()# 使用多线程处理多客户端的连接client_thread = threading.Thread(target=self.handle_client, args=(client_socket,))# 把客户端线程设置为守护线程client_thread.daemon = True# 启动子线程client_thread.start()def main():# 获取命令行输入的参数if len(sys.argv) > 2:  # 命令行只能带一个参数print(f"用法: python {__name__} <port>")sys.exit(1)elif len(sys.argv) == 2 and not sys.argv[1].isdigit():  # 参数只能是数字类型print(f"error: 无效的int值: {sys.argv[1]}")sys.exit(1)elif len(sys.argv) == 1:  # 没有带参数web_server = HttpWerServer()web_server.start()else:  # 带一个参数web_server = HttpWerServer(int(sys.argv[1]))web_server.start()# 判断是否是主模块的代码
if __name__ == '__main__':main()

命令行执行以下命令

python server.py            # 端口省略不写默认8000

浏览器访问静态资源  http://localhost:9000


方式二:

使用http.server模块来创建自己的服务器脚本。

# server.py
import http.server
import socketserverPORT = 8000Handler = http.server.SimpleHTTPRequestHandlerwith socketserver.TCPServer(("", PORT), Handler) as httpd:print("serving at port", PORT)httpd.serve_forever()

在Python 3中,打开命令行或终端,服务根目录在脚本所在目录,运行以下命令:

python server.py        

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

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

相关文章

纯vue+js实现数字0到增加到指定数字动画效果功能

关于数字增加动画效果网上基本上都是借助第三方插件实现的,就会导致有的项目安装插件总会出问题,所有最好使用原生vue+js实现,比较稳妥 纯vue+js实现数字0到增加到指定数字动画效果功能 vue+js 实现数字增加动画功能 效果图 其中,关于数字变化的间隔时间,延时效果都可…

数据结构与算法 —— DFS的定义与原理

DFS&#xff08;Distributed File System&#xff0c;分布式文件系统&#xff09;是一种允许网络连接的多个计算机之间共享信息的系统架构。与传统的文件系统&#xff08;如NTFS、HFS等&#xff09;不同&#xff0c;DFS分布在多个文件服务器或多个位置&#xff0c;通过计算机网…

澳门建筑插画:成都亚恒丰创教育科技有限公司

澳门建筑插画&#xff1a;绘就东方之珠的斑斓画卷 在浩瀚的中华大地上&#xff0c;澳门以其独特的地理位置和丰富的历史文化&#xff0c;如同一颗璀璨的明珠镶嵌在南国海疆。这座城市&#xff0c;不仅是东西方文化交融的典范&#xff0c;更是建筑艺术的宝库。当画笔轻触纸面&a…

一个spring boot项目的启动过程分析

1、web.xml 定义入口类 <context-param><param-name>contextConfigLocation</param-name><param-value>com.baosight.ApplicationBoot</param-value> </context-param> 2、主入口类: ApplicationBoot,SpringBoot项目的mian函数 SpringBo…

时间序列学习篇

今天看了一些时间序列算法相关的文档和帖子。很惭愧&#xff0c;也是搞了很长时间预测算法的人了&#xff0c;但是都没能详细学习一下时间序列的理论。 首先&#xff0c;要预测一个时序问题&#xff0c;可以从什么路径解决呢&#xff1f;一种是认为过去序列状态影响将来的状态…

视频调整帧率、分辨率+音画同步

# python data_utils/pre_video/multi_fps_crop_sync.pyimport cv2 import os from tqdm import tqdm import subprocess# 加载人脸检测模型 face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml)def contains_face(frame):gray …

淘宝/天猫店铺商品搜索利器:taobao.item_search_shop API返回值详解

taobao.item_search_shop 这个API名称听起来像是针对淘宝或天猫平台的一个商品搜索接口&#xff0c;但实际上&#xff0c;淘宝和天猫的官方API体系中并没有直接命名为taobao.item_search_shop的公开API。不过&#xff0c;为了解答关于类似功能的API返回值详解&#xff0c;我们可…

(三)Redis持久化,你真的懂了吗?万字分析AOF和RDB的优劣 AOF的刷盘、重写策略 什么叫混合重写 MP-AOF方案是什么

引言 —— Redis基础概念 Redis概念&#xff1a;Redis (REmote DIctionary Server) 是用 C 语言开发的一个开源的高性能键值对&#xff08;key-value&#xff09;数据库。 为什么会出现Redis呢&#xff1f;它的到来是为了解决什么样的问题&#xff1f; Redis 是一个NOSQL类型…

27 设备流转使用心得 三

前两部分参考心得 25 26 分布式文件传输 1 源端 1 获取分布式文件路径 读取文件 写入分布式文件 2 对端 1 通过应用沙箱获取分布式文件路径 读取文件路径 与状态数据绑定 2 绑定之后UI渲染 Index Row({space:8}){//用户当前选中的所有图片ForEach(this.photos, (p:str…

操作系统真象还原:创建文件系统

14.2 创建文件系统 14.2.1 创建超级块、i结点、目录项 超级块 /** Author: Adward-DYX 1654783946qq.com* Date: 2024-05-07 10:18:02* LastEditors: Adward-DYX 1654783946qq.com* LastEditTime: 2024-05-07 11:24:50* FilePath: /OS/chapter14/14.2/fs/super_block.h* Des…

构造、析构、拷贝(Semantics of Construction,Destruction,and Copy)

1、继承体系下的对象构造 当我定义一个object如下 T object;如果T有一个默认构造函数&#xff0c;它会被调用。 比较不明显的是构造函数内部有大量的隐藏代码&#xff0c;因为编译器会扩充构造函数&#xff0c;一般而言编译器所做的扩充如下&#xff1a; 记录在成员初始化列…

WPF学习(6) -- WPF命令和通知

一 、WPF命令 1.ICommand代码 创建一个文件夹和文件 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Input;namespace 学习.Command {public class MyCommand : ICommand{Acti…

CCSI: 数据无关类别增量学习的持续类特定印象| 文献速递-基于深度学习的多模态数据分析与生存分析

Title 题目 CCSI: Continual Class-Specific Impression for data-free class incremental learning CCSI: 数据无关类别增量学习的持续类特定印象 01 文献速递介绍 当前用于医学影像分类任务的深度学习模型表现出令人鼓舞的性能。这些模型大多数需要在训练之前收集所有的…

设计模式使用场景实现示例及优缺点(行为型模式——迭代子模式)

迭代子模式&#xff08;Iterator Pattern&#xff09; 迭代子模式&#xff08;Iterator Pattern&#xff09;是一种常用的设计模式&#xff0c;属于行为型模式。它提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又无需暴露该对象的内部表示。 核心组件 Iterat…

中间件——Kafka

两个系统各自都有各自要去做的事&#xff0c;所以只能将消息放到一个中间平台&#xff08;中间件&#xff09; Kafka 分布式流媒体平台 程序发消息&#xff0c;程序接收消息 Producer&#xff1a;Producer即生产者&#xff0c;消息的产生者&#xff0c;是消息的入口。 Brok…

[Vulnhub] Sedna BuilderEngine-CMS+Kernel权限提升

信息收集 IP AddressOpening Ports192.168.8.104TCP:22, 53, 80, 110, 111, 139, 143, 445, 993, 995, 8080, 55679 $ nmap -p- 192.168.8.104 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 6.6.1p1 Ubuntu 2ubuntu2 …

在RHEL9.4上启用SFTP服务

FTP存在的不足&#xff1a; 明文传输 FTP传输的数据&#xff08;包括用户名、密码和文件内容&#xff09;都是明文的&#xff0c;这意味着数据可以被网络上的任何人截获并读取。没有内置的加密机制&#xff0c;容易受到中间人攻击。 被动模式下的端口问题 FTP的被动模式需要…

读人工智能全传12人工智能导致的问题1

1. 人工智能会导致什么问题 1.1. 人工智能是一门通用技术&#xff1a;它的应用仅仅受限于我们的想象 1.1.1. 所有的技术都可能产生意想不到的效果&#xff0c;未来几十年甚至几百年内都存在可能性 1.2. 所有的技术都可能被滥用 1.2.1. 我们的无名氏祖先率先用上了火&#x…

大型土木工程项目灾害防御规划与风险评估系统

灾害防御规划更新与维护机制 SELECT DISTINCT 地质灾害类型 FROM 地质灾害信息表;SELECT 地质灾害类型, COUNT(*) AS 发生次数, (COUNT(*) * 100.0 / (

React Native和Swift有什么区别

React Native和Swift在多个方面存在显著的区别&#xff0c;这些区别主要体现在它们的技术基础、应用场景、性能特点、开发效率以及社区支持等方面。 一、技术基础 React Native&#xff1a;是一个由Meta&#xff08;原Facebook&#xff09;开发的开源JavaScript框架&#xff…