2016-06-06 4 views
2

Мне нравится простота использования SimpleHTTPServer Пайтона, но ...Python Простой HTTP-сервер в виртуальном каталоге

Я хотел бы, чтобы запустить его от того, что я называю «фальшивый каталог» - то есть, каталог, который существует только с точки зрения сервера (фактически не сохраняется на компьютере) и перестает существовать, когда останавливается процесс python, на котором запущен сервер. Я мог бы также сделать с временным каталогом, но я хочу гарантировать, что этот каталог будет удален после (так что я не накапливаю файлы каждый раз, когда я запускаю это и должен думать об их ручном стирании).

Кто-нибудь знает, что это лучший способ сделать это?

+0

Вы обслуживаете файлы локально с помощью python -m simplehttpserver или делаете что-то более сложное (через Handlers и т. Д.)? –

+0

Я обслуживаю файлы локально (хотя я не запускаю SimpleHTTPServer в своем собственном процессе, как в вашей команде, я запускаю его в потоке.) – Peter

+0

Вы должны добавить это как немного информации на вопрос. Я добавил один ответ на вопрос, основанный на информации в комментариях. Надеюсь, поможет. –

ответ

1

Я бы сделал это, используя базу данных sqlite в памяти. Вы получаете все преимущества базы данных sql (отношения, возможность поиска и т. Д.), Но она существует только для жизни процесса.

Вы можете использовать пакет libsqlfs, который эмулирует полную файловую систему POSIX, или вы можете создать свой собственный с помощью нескольких простых таблиц для хранения каталогов и файлов. Это зависит от того, насколько тщательно вы хотите эмулировать фактическую файловую систему.

1

Вы можете использовать TemporaryDirectory или mkdtemp и сделать серверный сервис из этого каталога. При первом подходе и при использовании в качестве менеджера контекста вы получаете автоматическую очистку.

В качестве альтернативы вы можете попробовать запустить все внутри контейнерной системы, например, Docker. Таким образом, вы получаете изоляцию всех операций внутри контейнера и вид файловой системы и разрешаете только те изменения, которые вы хотите. Однако это своего рода тяжелое оружие.

1

Вот фрагмент того, что вы могли бы достичь, используя mkdtemp. Он не удаляет файлы, если процесс python будет убит. Может быть, обработчик сигнала мог бы выполнить эту работу.

import SimpleHTTPServer 
import tempfile 
import os 
import shutil 

class CustomHTTPServer(): 
    pass 

if __name__ == '__main__': 
    tmpdir = tempfile.mkdtemp() 
    try: 
     print "Serving files under %s" % tmpdir 
     os.chdir(tmpdir) 
     SimpleHTTPServer.test() 
    except Exception: 
     pass 
    finally: 
     shutil.rmtree(tmpdir) 

, который вы можете просто вызвать, используя python -m CustomHTTPServer.

0

Вы могли наследовать от SimpleHTTPServer и переопределить метод list_directory и translate_path, но если вы на самом деле не против демпинга на диск, вы можете сделать себе временный каталог контекста менеджер, который обрабатывает удаление каталогов с shutil:

from tempfile import mkdtemp 
import shutil 

class TempDir(object): 
    def __init__(self, *args, **kwargs): 
     self.args = args 
     self.kwargs = kwargs 

    def __enter__(self): 
     self.tempdir = mkdtemp(*self.args, **self.kwargs) 
     return self.tempdir 

    def __exit__(self, *args): 
     return shutil.rmtree(self.tempdir) 

И затем обслуживайте его с помощью SimpleHTTPServer.

from SimpleHTTPServer import test 
import os 

with TempDir(prefix="server") as dirname: 
    os.chdir(dirname) 
    try: 
     test() 
    except KeyboardInterrupt: 
     pass 
+0

Я начал писать это, когда еще не было ответов на этот вопрос, кажется, я был слишком медленным! –