我有这个基本的python3服务器,但不知道如何提供目录。
class SimpleHTTPRequestHandler(BaseHTTPRequestHandler):
def do_GET(self):
print(self.path)
if self.path == '/up':
self.send_response(200)
self.end_headers()
self.wfile.write(b'Going Up')
if self.path == '/down':
self.send_response(200)
self.end_headers()
self.wfile.write(B'Going Down')
httpd = socketserver.TCPServer(("", PORT), SimpleHTTPRequestHandler)
print("Server started on ", PORT)
httpd.serve_forever()
如果代替上面的自定义类,我只是将Handler = http.server.SimpleHTTPRequestHandler
传递到TCPServer():中,默认功能是服务目录,但是我想服务该目录并在上面的两个GET中具有功能。
例如,如果有人要访问localhost:8080 / index.html,我希望将该文件提供给他们
答案 0 :(得分:1)
如果您使用的是3.7,则可以简单地在您的html文件所在的目录中提供服务,例如。 index.html仍然是
python -m http.server 8080 --bind 127.0.0.1 --directory \your_directory\
答案 1 :(得分:0)
您要扩展 SimpleHTTPRequestHandler
的功能,所以您子类!检查您的特殊情况,如果没有特殊情况,请致电super().do_GET()
,让其余的事情解决。
示例:
class MyHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
if self.path == '/up':
self.send_response(200)
self.end_headers()
self.wfile.write(b'up')
else:
super().do_GET()
要提供文件,基本上只需要打开它们,阅读内容并发送即可。
要提供目录(索引),请使用os.listdir()
。 (如果需要,可以在接收目录时首先检查index.html,然后如果失败,则提供索引列表。)
将其放入您的代码中将为您提供:
class MyHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
print(self.path)
if self.path == '/up':
self.send_response(200)
self.end_headers()
self.wfile.write(b'Going up')
elif os.path.isdir(self.path):
try:
self.send_response(200)
self.end_headers()
self.wfile.write(str(os.listdir(self.path)).encode())
except Exception:
self.send_response(500)
self.end_headers()
self.wfile.write(b'error')
else:
try:
with open(self.path, 'rb') as f:
data = f.read()
self.send_response(200)
self.end_headers()
self.wfile.write(data)
except FileNotFoundError:
self.send_response(404)
self.end_headers()
self.wfile.write(b'not found')
except PermissionError:
self.send_response(403)
self.end_headers()
self.wfile.write(b'no permission')
except Exception:
self.send_response(500)
self.end_headers()
self.wfile.write(b'error')
这个例子有很多错误处理。您可能需要将其移动到其他地方。
问题是这是从您的根目录提供的。要停止此操作,您必须(简单的方法)仅将服务目录添加到self.path
的开头。还要检查..
是否使您降落得比您想要的高。一种方法是os.path.abspath(serve_from+self.path).startswith(serve_from)
将其放入内部(检查完/ up之后):
class MyHandler(http.server.BaseHTTPRequestHandler):
def do_GET(self):
print(self.path)
path = serve_from + self.path
if self.path == '/up':
self.send_response(200)
self.end_headers()
self.wfile.write(b'Going up')
elif not os.path.abspath(path).startswith(serve_from):
self.send_response(403)
self.end_headers()
self.wfile.write(b'Private!')
elif os.path.isdir(path):
try:
self.send_response(200)
self.end_headers()
self.wfile.write(str(os.listdir(path)).encode())
except Exception:
self.send_response(500)
self.end_headers()
self.wfile.write(b'error')
else:
try:
with open(path, 'rb') as f:
data = f.read()
self.send_response(200)
self.end_headers()
self.wfile.write(data)
# error handling skipped
except Exception:
self.send_response(500)
self.end_headers()
self.wfile.write(b'error')
请注意,您定义path
并随后使用它,否则您仍然可以从/