SimpleHTTPServer能否从两个不同目录提供文件?

10 投票
3 回答
12434 浏览
提问于 2025-04-17 06:52

如果我输入 python -m SimpleHTTPServer,它会把当前文件夹里的文件提供出来。

我的文件夹结构是这样的:

/protected/public
/protected/private
/test

我想在我的 /test 文件夹里启动服务器,并且希望它能提供 /test 文件夹里的文件。但是,我希望所有以 '/public' 开头的请求都能从 /protected/public 文件夹里获取。

比如说,访问 http://localhost:8000/public/index.html 时,实际上应该提供 /protected/public/index.html 这个文件。

这样做是可以通过内置的服务器实现,还是我需要自己写一个服务器呢?

3 个回答

7

我想我找到了这个问题的答案,基本上就是要改变当前的工作目录,启动服务器,然后再返回到你最初的工作目录。

这是我实现的方法,我给你注释掉了两组选项,因为对我来说,解决办法就是先移动到我应用程序目录下的一个文件夹,然后再返回到原来的应用程序目录。不过,你可能想去文件系统中的其他目录,然后再返回到其他地方,或者根本不返回。

#Setup file server
import SimpleHTTPServer
import SocketServer
import os

PORT = 5002

#  -- OPTION 1 --
#os.chdir(os.path.join(os.path.abspath(os.curdir),'PATH_TO_FOLDER_IN_APP_DIR'))
#  -- OPTION 2 --
#os.chdir('PATH_TO_ROOT_DIRECTORY')

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

httpd = SocketServer.TCPServer(("", PORT), Handler)

print "serving at port", PORT
httpd.serve_forever()

#  -- OPTION 1 --
#os.chdir(os.path.abspath('..'))
#  -- OPTION 2 --
#os.chdir('PATH_TO_ORIGINAL_WORKING_DIR')

告诉我效果怎么样!

16

我觉得这样做是完全可能的。你可以在 /test 这个文件夹里启动服务器,并且可以像下面这样重写 SimpleHTTPRequestHandlertranslate_path 方法:

import BaseHTTPServer
import SimpleHTTPServer
server_address = ("", 8888)
PUBLIC_RESOURCE_PREFIX = '/public'
PUBLIC_DIRECTORY = '/path/to/protected/public'

class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
    def translate_path(self, path):
        if self.path.startswith(PUBLIC_RESOURCE_PREFIX):
            if self.path == PUBLIC_RESOURCE_PREFIX or self.path == PUBLIC_RESOURCE_PREFIX + '/':
                return PUBLIC_DIRECTORY + '/index.html'
            else:
                return PUBLIC_DIRECTORY + path[len(PUBLIC_RESOURCE_PREFIX):]
        else:
            return SimpleHTTPServer.SimpleHTTPRequestHandler.translate_path(self, path)

httpd = BaseHTTPServer.HTTPServer(server_address, MyRequestHandler)
httpd.serve_forever()

希望这对你有帮助。

5

我觉得SimpleHTTPServer这个工具没有这个功能。不过,如果你在/test文件夹里创建一个指向/protected/public的符号链接,那样应该能达到类似的效果。

撰写回答