Python3中的服务目录

Python3中的服务目录,python,python-3.x,server,Python,Python 3.x,Server,我有一个基本的python3服务器,但不知道如何为目录服务 class SimpleHTTPRequestHandler(BaseHTTPRequestHandler): def do_GET(self): print(self.path) if self.path == '/up': self.send_response(200) self.end_headers()

我有一个基本的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,我希望将该文件提供给他们

如果您使用的是3.7,您只需提供一个目录,其中包含html文件,例如index.html

python -m http.server 8080 --bind 127.0.0.1 --directory \your_directory\
对于

简单的方法 您想扩展
SimpleHTTPRequestHandler
的功能,因此您可以子类它!检查您的特殊情况,如果没有一个适用,请调用
super()

例如:

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\u from+self.path)。startswith(serve\u from)

将其放入(检查/安装后):


注意:您定义了
path
并随后使用它,否则您仍将从/

提供服务。对于任何python问题,请始终使用通用[python]标记。如果您的问题是特定于版本的,请使用特定于版本的标记。通常,在python标记上,假设您使用的是Python3
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')