如果我python -m SimpleHTTPServer
,它会提供当前目录中的文件。
我的目录结构如下所示:
/protected/public
/protected/private
/test
我想在/test
目录中启动服务器,我希望它能够在/test
目录中提供文件。但我希望从{/ 1}}目录中提取以'/ public'开头的所有服务器请求。
例如/protected/public
的请求将在http://localhost:8000/public/index.html
内置服务器可以实现这一点,还是必须编写自定义服务器?
答案 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的符号链接,那应该有效地做同样的事情。