测试完您的完整代码后,我可以在使用 self.path = "index.html" 或 self.path = "folder/index.html" 时运行它,但前提是 "folder/index.html" 在我运行代码的文件夹内。
这可能是出于安全原因。它可能无法读取我在其中运行代码的文件夹下方/外部的文件,因为有人可以使用路径,即。 ../../etc/passwd 窃取密码。
据我所知,服务器 Apache 还限制对运行文件夹下方/外部文件夹的访问。
所有服务器都应该限制它。
您可能必须编写自己的代码来从文件中读取数据并发送到浏览器。
您可以使用http.server 获取文件路径以查看源代码
print(http.server.__file__)
也许对你有帮助。
在源代码中,我看到了函数copyfile,它用于发送文件。
坦率地说,我宁愿使用Flask 来创建它。
编辑:
在挖掘源代码后,我可以看到原来的do_GET 使用translate_path() 将path 转换为current_folder/path,这可能是不正确的,它找不到文件。
我使用源代码中的代码创建了这个版本 - 它运行几乎所有来自原始 do_GET 的代码,除了 translate_path(),因此我可以使用绝对路径来显示文件。
import http.server
import socketserver
import os
#print('source code for "http.server":', http.server.__file__)
class MyServer(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
print(self.path)
if self.path == '/':
#self.path = '/home/furas/test/index.html'
self.path = './desktop/formdailyactivities/index.html'
print('original :', self.path)
print('translated:', self.translate_path(self.path))
try:
f = open(self.path, 'rb')
except OSError:
self.send_error(HTTPStatus.NOT_FOUND, "File not found")
return None
ctype = self.guess_type(self.path)
fs = os.fstat(f.fileno())
self.send_response(200)
self.send_header("Content-type", ctype)
self.send_header("Content-Length", str(fs[6]))
self.send_header("Last-Modified",
self.date_time_string(fs.st_mtime))
self.end_headers()
try:
self.copyfile(f, self.wfile)
finally:
f.close()
else:
# run normal code
print('original :', self.path)
print('translated:', self.translate_path(self.path))
super().do_GET()
# --- main ---
handler_object = MyServer
PORT = 8080
print(f'Starting: http://localhost:{PORT}')
try:
socketserver.TCPServer.allow_reuse_address = True # solution for `OSError: [Errno 98] Address already in use`
my_server = socketserver.TCPServer(("", PORT), handler_object)
my_server.serve_forever()
except KeyboardInterrupt:
# solution for `OSError: [Errno 98] Address already in use - when stoped by Ctr+C
print('Stoped by "Ctrl+C"')
finally:
# solution for `OSError: [Errno 98] Address already in use
print('Closing')
my_server.server_close()