7

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

我的目录结构如下所示:

/protected/public
/protected/private
/test

我想在我的/test目录中启动服务器,并希望它为目录中的文件提供服务/test。但我希望从/protected/public目录中提取以“/public”开头的所有对服务器的请求。

ega 请求http://localhost:8000/public/index.html将在/protected/public/index.html

内置服务器可以做到这一点,还是我必须编写一个自定义服务器?

4

3 回答 3

13

我认为完全有可能做到这一点。您可以在目录中启动服务器/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()

希望这可以帮助。

于 2013-12-05T19:43:13.367 回答
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')

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

于 2011-12-30T01:16:19.527 回答
4

我不相信 SimpleHTTPServer 具有此功能,但是如果您在 /test 内部使用指向 /protected/public 的符号链接,那应该可以有效地做同样的事情。

于 2011-11-22T21:49:12.377 回答