Python SimpleHTTPServer serve a subdirectory



是否可以使用 SimpleHTTPServer 提供子目录而不是当前目录?

我从命令行使用它,如下所示:

python -m SimpleHTTPServer 5002

我想使用它的原因是我有一个target文件夹,我不时删除它,并通过我的工具重新生成。但是,当我这样做时,我还需要重新启动SimpleHTTPServer。我认为从父存储库提供它将允许我不重新启动它。

好吧,要为父目录提供服务,只需在运行 Python 脚本之前更改当前工作目录 ( python -m SimpleHTTPServer 5002 )。

您可以编写自己的脚本,例如:"my_server.py":

import SimpleHTTPServer
import os

def main():
    pwd = os.getcwd()
    try:
        os.chdir("..")  # or any path you like
        SimpleHTTPServer.test()
    finally:
        os.chdir(pwd)

if __name__ == "__main__":
    main()

然后运行"my_server.py":

python -m my_server 5002

如果你从 shell 调用它,你可以只使用 shell 功能并执行以下操作:

对于 Python 2:

pushd /path/you/want/to/serve; python -m SimpleHTTPServer; popd

对于Python 3.6,你甚至不需要这样做。
有一个目录参数要http.server,所以只需执行以下操作:

python3 -m http.server -d /path/you/want/to/serve

但是,如果你想以编程方式调用它,Andy Hayden 提出的解决方案"如何运行服务于特定路径的 http 服务器?"似乎更合适。
(它不太"黑客"/依赖于副作用,而是使用类构造函数。

是这样的:

import http.server
import socketserver
PORT = 8000
DIRECTORY = "web"

class Handler(http.server.SimpleHTTPRequestHandler):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, directory=DIRECTORY, **kwargs)

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

上面的代码适用于 Python>= 3.6
对于 Python 3.5 之前,没有可用于 TCPServer 基类的上下文管理器协议,但这仅意味着您需要更改 with 语句并将其转换为普通赋值:

httpd = socketserver.TCPServer(("", PORT), Handler)

感谢安东尼·索蒂尔(Anthony Sottile)的最后一个细节。

相关内容

  • 没有找到相关文章

最新更新