py网络_建立响应目录笔记

建立响应目录

通过不断的努力已经成功开发了一个HTTP服务器,但是对于当前服务器开发有一个问题,所有的请求都只能得到一个统一的内容响应:

如果这些代码直接以字符串的形式出现在整个的Python程序里面,那么这样的HTML代码是很难被我们前端进行维护的,前端需要的是一个可以进行响应的处理目录,相当于建立一个专属的html响应代码目录,而后所有要响应的内容都保存在此目录之中,根据用户请求的路径来进行内容的加载。

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# coding : UTF-8
import socket # HTTP是基于TCP协议,所以一定要使用socket模块
import multiprocessing # 考虑到处理性能,应该为每一次的请求开启一个新的进程
import re
import os
HTML_ROOT_DIR = os.getcwd() + os.sep + "template" # 响应目录
class HTTPServer: # 定义一个HTTP服务器程序类
def __init__(self,port): # 服务器一定要有一个监听端口
self.server_socket = socket.socket(socket.AF_INET,socket.SOCK_STREAM) # 创建socket实例
# 考虑到不同系统的问题,80端口是一个必争端口,该端口属于系统的核心端口
self.server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
self.server_socket.bind(("0.0.0.0",port)) # 绑定监听端口
self.server_socket.listen() # 启动监听
def start(self):
while True:
client_socket,client_address = self.server_socket.accept() # 接收用户请求
print("[新的客户端连接]客户端IP:%s、访问端口:%s" % client_address)
# 将每一个客户端都设置为一个独立的进程存在,每一个进程都分别进行请求的回应
handle_client_process = multiprocessing.Process(target=self.handle_response,
args=(client_socket,))
handle_client_process.start() # 启动一个新的进程
def handle_response(self,client_socket): # 对某一个指定的客户端进行响应
request_headers = client_socket.recv(1024)
try:
file_name = re.match(r"\w+ +(/[^ ]*)", request_headers.decode().split("\r\n")[0]).group(1)
print("请求文件:%s" % file_name)
if file_name == "/": # 匹配根路径
file_name = "/index.html"
if file_name.endswith(".html") or file_name.endswith(".htm"):
client_socket.send(bytes(self.get_html_data(file_name),"UTF-8"))
else:
client_socket.send(self.get_binary_data(file_name))
except:
client_socket.send(bytes(self.get_html_data("/404.html"), "UTF-8"))
client_socket.close()
def get_binary_data(self,file_name):
response_body = self.read_file(file_name)
return response_body
def read_file(self,file_name):
file_path = os.path.normpath(HTML_ROOT_DIR + file_name)
file = open(file_path,"rb") # 采用二进制流的形式进行读取
file_data = file.read() # 读取文件内容
file.close()
return file_data
def get_html_data(self,file_name): # 读取指定的文件
response_start_line = "HTTP/1.1 200 OK\r\n"
response_headers = "Server:giiiServer\r\nContent-Type:text/html\r\n"
response_body = self.read_file(file_name).decode("UTF-8")
response = response_start_line + response_headers + "\r\n" + response_body
return response
def main(): # 主函数
http_server = HTTPServer(80)
http_server.start()
if __name__ == "__main__":
main()

此时会根据用户的请求路径找到指定的文件进行内容的加载并将此内容返回给用户,如果要进行页面维护的话,只需要修改html文件目录中的程序即可。

测试结果


py网络_建立响应目录笔记
https://blog.wangxk.cc/2020/02/06/py网络-建立响应目录笔记/
作者
Mike
发布于
2020年2月6日
许可协议