是否可以让SimpleHTTPServer从两个不同的目录中提供文件?

时间:2011-11-22 21:47:00

标签: python simplehttpserver

如果我python -m SimpleHTTPServer,它会提供当前目录中的文件。

我的目录结构如下所示:

/protected/public
/protected/private
/test

我想在/test目录中启动服务器,我希望它能够在/test目录中提供文件。但我希望从{/ 1}}目录中提取以'/ public'开头的所有服务器请求。

例如/protected/public的请求将在http://localhost:8000/public/index.html

提供该文件

内置服务器可以实现这一点,还是必须编写自定义服务器?

3 个答案:

答案 0 :(得分:8)

我认为绝对有可能这样做。您可以在/test目录中启动服务器并覆盖translate_path SimpleHTTPRequestHandler方法,如下所示:

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()

希望这有帮助。

答案 1 :(得分:7)

我想我找到了答案,基本上它涉及更改当前工作目录,启动服务器然后返回到原始工作目录。

这就是我实现它的方式,我已经为您注释了两组选项,因为我的解决方案只是移动到我的app目录中的一个文件夹,然后将一个级别备份到原始的app目录。但是,您可能希望转到文件系统中的整个其他目录,然后返回其他位置或根本不返回。

#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')

让我知道它是如何运作的!

答案 2 :(得分:2)

我不相信SimpleHTTPServer有这个功能,但是如果你在/ test中使用指向/ protected / public的符号链接,那应该有效地做同样的事情。