1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Python搭建静态web服务器

Python搭建静态web服务器

时间:2021-04-07 02:50:01

相关推荐

Python搭建静态web服务器

核心还是使用Python的socket实现的,socket的具体用法前面文章有写,这里不写太多注释。

1.本地搭建python静态web服务器

在资源目录打开命令终端,输入命令:python -m http.server [端口号],端口号不写默认8000即可

然后在浏览器输入localhost:8000/资源路径即可访问你想访问的页面

2.返回固定数据的静态web服务器

'''返回固定数据的静态web服务器'''# 导入模块import socket# 创建socket对象static_web_server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)static_web_server_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True) # 设置端口复用static_web_server_socket.bind(('',7777))static_web_server_socket.listen(128)# 接收请求()while True:client,ip_port=static_web_server_socket.accept()print(f'客户端{ip_port[0]}使用端口{ip_port[1]}连接成功...')# 接收客户端的请求信息request_data=client.recv(1024).decode('gbk')print(request_data)# 读取资源内容,无论客户端访问的哪个文件,返回的都是这个文件with open('static/index.html','rb') as file:file_content=file.read() # 作为响应体# 响应行response_line='HTTP/1.1 200 OK\r\n'# 响应头response_header='Server: Tengine\r\nContent-Type: text/html; charset=UTF-8\r\nConnection: keep-alive\r\n'# 拼接相应报文(响应行+响应头+空行+响应体),需是二进制数据response_data=(response_line+response_header+'\r\n').encode('utf-8')+file_content# 发送报文client.send(response_data)# 关闭客户端连接client.close()print(f'客户端{ip_port[0]}关闭连接')# 关闭服务器static_web_server_socket.close()print('Stop!')

3.返回指定数据的静态web服务器

'''返回指定数据的静态web服务器'''import socketdef server_start(port):web_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)web_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)web_server.bind(('',port))web_server.listen(128)while True:client,ip_port=web_server.accept()print(f'客户端{ip_port[0]}使用{ip_port[1]}端口连接成功')request_info=client.recv(1024).decode('gbk')if len(request_info)==0:client.close()continue# print(request_info)resource_path=request_info.split()[1]print(f'{ip_port[0]}请求的资源路径是:{resource_path}')if resource_path=='/':resource_path='index.html'try:with open(f'static/{resource_path}','rb') as f:response_body=f.read()except Exception as e:print('请求的文件不存在,请检查',e)with open('static/404.html','rb') as f:response_body=f.read()response_line = 'HTTP/1.1 404 NOT FOUND\r\n'else:print('资源请求成功!')response_line='HTTP/1.1 200 OK'finally:response_header='Server:PSWS1.0\r\nContent-Type:text/html;Charset=UTF-8\r\n'response_data=(response_line+response_header+'\r\n').encode()+response_bodyclient.send(response_data)client.close()if __name__ == '__main__':server_start(7777)print('Stop')

4.多任务版静态web服务器

'''多任务版静态web服务器'''import socketimport multiprocessingimport threadingdef server_start(port):web_server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)web_server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,True)web_server.bind(('',port))web_server.listen(128)while True:client,ip_port=web_server.accept()# 多进程实现多任务# t=multiprocessing.Process(target=transit,args=(client,ip_port))# t.daemon=True# 多线程实现多任务t=threading.Thread(target=transit,args=(client,ip_port))t.setDaemon(True)t.start()# 多线程不写,但是多进程必须写# client.close()# 执行不到,不写也行web_server.close()def transit(client,ip_port):print(f'客户端{ip_port[0]}使用{ip_port[1]}端口连接成功')request_info = client.recv(1024).decode('gbk')if len(request_info) == 0:print(f'{ip_port[0]}关闭了连接')client.close()return# print(request_info)resource_path = request_info.split()[1]print(f'{ip_port[0]}请求的资源路径是:{resource_path}')if resource_path == '/':resource_path = 'index.html'try:with open(f'static/{resource_path}', 'rb') as f:response_body = f.read()except Exception as e:print('请求的文件不存在,请检查', e)with open('static/404.html', 'rb') as f:response_body = f.read()response_line = 'HTTP/1.1 404 NOT FOUND\r\n'else:print('资源请求成功!')response_line = 'HTTP/1.1 200 OK'finally:response_header = 'Server:PSWS1.0\r\nContent-Type:text/html;Charset=UTF-8\r\n'response_data = (response_line + response_header + '\r\n').encode() + response_bodyclient.send(response_data)client.close()if __name__ == '__main__':server_start(7777)print('Stop')

5.多任务版静态web服务器(面向对象)

'''多任务版静态web服务器(面向对象)'''import socket# import multiprocessingimport threadingclass WebServer(object):def __init__(self,port):self.web_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.web_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)self.web_server.bind(('', port))self.web_server.listen(128)def server_start(self):while True:client,ip_port=self.web_server.accept()# 多进程实现多任务# t=multiprocessing.Process(target=self.transit,args=(client,ip_port))# t.daemon=True# 多线程实现多任务t=threading.Thread(target=self.transit,args=(client,ip_port))t.setDaemon(True)t.start()# 多线程不写,但是多进程必须写# client.close()# 执行不到,不写也行self.web_server.close()def transit(self,client,ip_port):print(f'客户端{ip_port[0]}使用{ip_port[1]}端口连接成功')request_info = client.recv(1024).decode('gbk')if len(request_info) == 0:print(f'{ip_port[0]}关闭了连接')client.close()return# print(request_info)resource_path = request_info.split()[1]print(f'{ip_port[0]}请求的资源路径是:{resource_path}')if resource_path == '/':resource_path = 'index.html'try:with open(f'static/{resource_path}', 'rb') as f:response_body = f.read()except Exception as e:print('请求的文件不存在,请检查', e)with open('static/error.html', 'rb') as f:response_body = f.read()response_line = 'HTTP/1.1 404 NOT FOUND\r\n'else:print('资源请求成功!')response_line = 'HTTP/1.1 200 OK'finally:response_header = 'Server:PSWS1.0\r\nContent-Type:text/html;Charset=UTF-8\r\n'response_data = (response_line + response_header + '\r\n').encode() + response_bodyclient.send(response_data)client.close()if __name__ == '__main__':WebServer(7777).server_start()

6.多任务版静态web服务器(命令行传参)

格式:python(或python3) 文件名.py 参数

'''多任务版静态web服务器(命令行传参)python(或python3) 文件名.py 参数'''import socket# import multiprocessingimport threadingimport sysclass WebServer(object):def __init__(self,port):self.web_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.web_server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)self.web_server.bind(('', port))self.web_server.listen(128)def server_start(self):while True:client,ip_port=self.web_server.accept()# 多进程实现多任务# t=multiprocessing.Process(target=self.transit,args=(client,ip_port))# t.daemon=True# 多线程实现多任务t=threading.Thread(target=self.transit,args=(client,ip_port))t.setDaemon(True)t.start()# 多线程不写,但是多进程必须写# client.close()# 执行不到,不写也行self.web_server.close()def transit(self,client,ip_port):print(f'客户端{ip_port[0]}使用{ip_port[1]}端口连接成功')request_info = client.recv(1024).decode('gbk')if len(request_info) == 0:print(f'{ip_port[0]}关闭了连接')client.close()return# print(request_info)resource_path = request_info.split()[1]print(f'{ip_port[0]}请求的资源路径是:{resource_path}')if resource_path == '/':resource_path = 'index.html'try:with open(f'static/{resource_path}', 'rb') as f:response_body = f.read()except Exception as e:print('请求的文件不存在,请检查', e)with open('static/404.html', 'rb') as f:response_body = f.read()response_line = 'HTTP/1.1 404 NOT FOUND\r\n'else:print('资源请求成功!')response_line = 'HTTP/1.1 200 OK'finally:response_header = 'Server:PSWS1.0\r\nContent-Type:text/html;Charset=UTF-8\r\n'response_data = (response_line + response_header + '\r\n').encode() + response_bodyclient.send(response_data)client.close()if __name__ == '__main__':if len(sys.argv)!=2:print('请输入python3 文件名.py 端口号')else:port=sys.argv[1]if port.isdigit():WebServer(int(port)).server_start()else:print('端口号必须为数字')

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。