虚拟目录中的Python简单HTTP服务器

时间:2016-06-06 15:11:29

标签: python server simplehttpserver

我喜欢Python的SimpleHTTPServer的易用性,但......

我想从我称之为“假目录”的地方启动它 - 也就是说,一个目录只存在于服务器的角度(实际上并不存在于计算机上),并且不再存在当运行服务器的python进程停止时。我也可以使用临时目录,但我想保证此目录被删除(因此我不会在每次运行时累积文件而必须考虑手动擦除它们)。

有谁知道最好的方法是什么?

4 个答案:

答案 0 :(得分:1)

我会通过使用内存中的sqlite数据库来完成此操作。您可以获得sql数据库的所有好处(关系,可搜索性等),但它只存在于进程的整个生命周期中。

您可以使用模拟完整POSIX文件系统的程序包libsqlfs,也可以使用几个简单的表来创建自己的目录和文件。这取决于您想要模拟实际文件系统的彻底程度。

答案 1 :(得分:1)

您可以使用TemporaryDirectorymkdtemp并从该目录中提供服务器服务。使用第一种方法,如果用作上下文管理器,则可以自动清理。

或者,您可以尝试在容器系统中运行所有内容,例如Docker。这样你就可以隔离容器内的所有操作,并查看文件系统,只允许你想要的修改。然而,它是一种重型武器。

答案 2 :(得分: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召唤。

答案 3 :(得分: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