Возможно ли, чтобы SimpleHTTPServer обслуживал файлы из двух разных каталогов? - PullRequest
4 голосов
/ 23 ноября 2011

Если я делаю python -m SimpleHTTPServer, он обслуживает файлы в текущем каталоге.

Моя структура каталогов выглядит так:

/protected/public
/protected/private
/test

Я хочу запустить сервер в моем каталоге /test и хочу, чтобы он обслуживал файлы в каталоге /test. Но я хочу, чтобы все запросы к серверу, начинающиеся с '/ public', извлекались из каталога /protected/public.

например, запрос к http://localhost:8000/public/index.html будет передавать файл на /protected/public/index.html

Возможно ли это со встроенным сервером, или мне придется написать собственный?

Ответы [ 3 ]

8 голосов
/ 05 декабря 2013

Я думаю, что это абсолютно возможно. Вы можете запустить сервер в каталоге /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()

Надеюсь, это поможет.

7 голосов
/ 30 декабря 2011

Я думаю, что нашел ответ на этот вопрос, в основном это связано с изменением текущего рабочего каталога, запуском сервера, а затем возвращением к исходному рабочему каталогу.

Вот как я этого добился, я закомментировал для вас два набора опций, так как для меня было просто перейти в папку в каталоге моего приложения, а затем вернуться на один уровень в исходный каталог приложения. Но, возможно, вы захотите перейти в другой каталог вашей файловой системы, а затем вернуться куда-нибудь еще или вообще не возвращаться.

#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 голосов
/ 23 ноября 2011

Я не верю, что SimpleHTTPServer имеет эту функцию, однако, если вы используете символическую ссылку внутри / test, которая указывает на / protected / public, это должно фактически сделать то же самое.

...