如何使用SimpleHttpRequestHandler运行python



我使用的是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()

相关内容

  • 没有找到相关文章

最新更新