SimpleHTTPServer能否从两个不同目录提供文件?
如果我输入 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
这个文件夹里启动服务器,并且可以像下面这样重写 SimpleHTTPRequestHandler
的 translate_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的符号链接,那样应该能达到类似的效果。