我使用的是python3。我想显示一个页面,但我得到了404未找到的文件:
import pymysql.cursors
import http.server
import socketserver
from furl import furl
class MyServer(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
print("jkjhjkhk") #printed
print(self.path)
if self.path == '/':
self.path = './desktop/formdailyactivities/index.html'
else:
self.send_response(200)
print (self.path)
f = furl(self.path)
# activity = f.args["activity"]
# time = f.args["time"]
# date = f.args["date"]
# print(activity)
# print(time)
# print(date)
# s1.insert(activity, time, date)
return http.server.SimpleHTTPRequestHandler.do_GET(self)
handler_object = MyServer
PORT = 8080
my_server = socketserver.TCPServer(("",PORT), handler_object)
my_server.serve_forever()
测试完完整的代码后,我可以在使用self.path = "index.html"
或self.path = "folder/index.html"
时运行它,但前提是"folder/index.html"
在我运行代码的文件夹中。
可能是出于安全原因。它可能无法读取我运行代码的文件夹下/外的文件,因为有人可能使用路径ie.../../etc/passwd
来窃取密码。
据我所知,服务器Apache
还限制访问运行文件夹下方/外部的文件夹
所有服务器都应该限制它。
您可能需要编写自己的代码,从文件中读取数据并发送到浏览器。
您可以使用http.server
获取文件路径以查看源代码
print(http.server.__file__)
也许这对你有帮助。
在源代码中,我看到了函数copyfile
,它用来发送文件。
坦率地说,我宁愿使用Flask
来创建它。
编辑:
在挖掘源代码后,我可以看到原始的do_GET
使用translate_path()
将path
转换为current_folder/path
,这可能是不正确的,并且找不到文件。
我使用源代码中的代码创建了这个版本——它运行了除了translate_path()
之外的几乎所有原始do_GET
中的代码,所以我可以使用绝对路径来显示文件。
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()