【问题标题】:Python Simple HTTP Server in Virtual Directory虚拟目录中的 Python 简单 HTTP 服务器
【发布时间】:2016-06-06 15:11:29
【问题描述】:

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

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

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

【问题讨论】:

  • 您是在本地使用 python -m simplehttpserver 提供文件还是在做一些更复杂的事情(通过处理程序等)?
  • 我在本地提供文件(尽管我没有像在你的命令中那样在自己的进程中启动 SimpleHTTPServer,而是在线程中启动它。)
  • 您应该将其作为一些信息添加到问题中。我已根据 cmets 中的信息为该问题添加了一个答案。希望对您有所帮助。

标签: python server simplehttpserver


【解决方案1】:

我会通过使用内存中的 sqlite 数据库来做到这一点。您可以获得 sql 数据库的所有好处(关系、可搜索性等),但它只在流程的生命周期内存在。

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

【讨论】:

    【解决方案2】:

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

    或者,您可以尝试在容器系统(例如 Docker)中运行所有内容。这样,您就可以隔离容器内的所有操作以及文件系统的视图,并且只允许您进行所需的修改。然而,它是一种重型武器。

    【讨论】:

      【解决方案3】:

      这里是使用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召唤它。

      【讨论】:

        【解决方案4】:

        您可以从 SimpleHTTPServer 继承并覆盖方法 list_directorytranslate_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
        

        【讨论】:

        • 我在没有答案的时候开始写这个,看来我太慢了!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多