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套接字,默认端口8000
def __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不指定表示使用本机ip
server_socket.bind(("", port))
# 设置监听
server_socket.listen(128)
self.server_socket = server_socket
@staticmethod
def handle_client(client_socket):
# 接收客户端的请求信息
recv_data = client_socket.recv(4096)
# 判断接收的数据长度是否为0
if len(recv_data) == 0:
client_socket.close()
return
# 对二进制数据进行解码
recv_content = recv_data.decode("utf-8")
print(recv_content)
# 对数据按照空格进行分割,为了拿到资源名称,例如:/abc.html
request_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-except
try:
# 打开文件读取文件中的数据, 提示:这里使用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 socketserver
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
with socketserver.TCPServer(("", PORT), Handler) as httpd:
print("serving at port", PORT)
httpd.serve_forever()
在Python 3中,打开命令行或终端,服务根目录在脚本所在目录,运行以下命令:
python server.py
作者:又逢乱世