首先我们先来了解一下什么是静态的Web服务器
1.静态Web服务器:可以向给服务器发出请求的浏览器返回静态资源的文档的程序
生活中我们访问的比如CSDN中的各种文章的时候,那些文章每天都不一样,每天都会更新,这个网页就是动态的, 而咱们搭建的是静态的,页面的数据不会变。
2. 如何搭建Python自带的静态Web服务器
(1)首先需要有一个html文件,也就是得需要准备一个带有html页面的文件夹
(2)然后通过python中的命令行搭建一个Python自带的Web静态服务器
效果图:(先进入带有html页面的文件中再执行python3 –m http.server 端口号)---断奶口号不指定默认是8000
现在代表Python自带的静态Web服务器已经搭建成功。
(3)可以查看一下HTTP的通信过程:
3.在Python中手动搭建静态Web服务器
首先说一下实现步骤:
- 把提供服务的Web服务器抽象成一个类
- 提供Web服务器的初始化方法,在初始化方法中创建socket对象
- 提供一个启动Web服务器的方法,让Web服务器同时并且无限处理客户端的请求
有了实现步骤,接下来我们就在python中开始搭建吧。(程序中有详细注释)
Python搭建静态Web服务器代码如下:
# 导入套接字模块,进程之间通信的工具模块
import socket
# 导入线程模块,提高程序效率
import threading
# 导入命令行,可实现在命令行中更改服务器端口号
import sys
# 创建一个Web服务器类
class WebServer(object):
# 定义初始化方法来定义socket关键字
def __init__(self,port):
# 1 创建服务器端套接字对象
web_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 端口复用
web_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 2 绑定端口
web_server.bind(("", port))
# 3 设置监听
web_server.listen(128)
# 将服务器套接字对象设置为self
self.web_server = web_server
# 定义一个静态方法专门处理浏览器请求
@staticmethod
def dispose_client_request(web_client):
# 5 接收浏览器发来的请求报文信息
request_data = web_client.recv(4096)
# 对接收到的请求数据进行分析,拿到用户想要访问的资源路径
request_path = request_data.decode().split(" ")[1]
# 进行判断
# 1长度是否为0,如果为0说明用户关闭了浏览器
if not request_data:
print("用户关闭了浏览器...")
web_client.close()
return
# 2用户是否访问的是根目录
if request_path == "/":
request_path = "/index.html"
# 设置响应行
response_line = "HTTP/1.1 200 OK\r\n"
# 设置响应头
response_header = "Server: WTT/1.1\r\n"
# 判断异常并进行处理
try:
# 1用户输入的路径确实在服务器中有资源的情况下
with open("./static" + request_path,'rb') as file1:
response_body = file1.read()
# 2用户输入的路径在服务器中找不到的情况下
except Exception:
with open("./static/404.html",'rb') as file2:
response_body = file2.read()
response_line = "HTTP/1.1 404 Found\r\n"
finally:
# 拼接响应行、响应头以及响应体
response_message = (response_line + response_header + "\r\n").encode() + response_body
# 6 将拼接好的数据返回给用户的浏览器
web_client.send(response_message)
# 7 关闭浏览器端的套接字
web_client.close()
# 定义一个方法启动Web服务器
def StartServer(self):
# 4 循环接收浏览器建立连接的请求
while True:
web_client, web_client_address = self.web_server.accept()
# 创建子线程对象,调用专门处理浏览器请求的方法
thd = threading.Thread(target=self.dispose_client_request, args = (web_client,))
# 设置守护主线程
thd.setDaemon(True)
# 启动子线程
thd.start()
def main():
# 判断命令行输入的格式是否符合要求
if not sys.argv[1].isdigit() or len(sys.argv)!=2 :
print("命令格式为:python3 xxx.py 端口号")
return
# 如果符合要求 将端口号赋给port
port = int(sys.argv[1])
# 创建Web服务器实例对象,将端口号当做参数传过去
Web_obj = WebServer(port)
# 使用对象调用启动Web服务器方法
Web_obj.StartServer()
if __name__ == '__main__':
# 调用main函数
main()