Python 中如何在代码中启动 HTTP 服务器(创建 .py 启动 HTTP 服务器)

11 投票
5 回答
12899 浏览
提问于 2025-04-18 12:09

目前我和很多人都在不同的平台上使用Python HTTP服务器(比如Windows、OS X,还有可能是Linux)。我们用这个服务器来测试一个JavaScript游戏。

现在我们是在每个平台的命令行(CMD、终端等)上启动Python HTTP服务器。虽然这样可以正常工作,但用这种方法越来越麻烦了。如果能有一个简单的脚本来启动Python HTTP服务器就好了。

这个脚本需要在所有平台上都能用,因为所有平台上都会安装Python,所以用Python来写这个脚本是个不错的主意。

目前我们用以下命令来启动服务器:

在Python 3上

python -m http.server

在Python 2上

python -m SimpleHTTPServer

我该如何把这些命令写成Python代码,然后保存为一个.py文件,双击就能启动HTTP服务器呢?

5 个回答

0

这是一个简化版的代码,它还可以从网址中提取值:

from http.server import HTTPServer, BaseHTTPRequestHandler
from urllib.parse import urlparse, parse_qs

class MyHandler(BaseHTTPRequestHandler):
        def do_GET(self):
        url_parts = urlparse(self.path)
        query_params = parse_qs(url_parts.query)
        param1 = query_params.get('param1', [''])[0]
        param2 = query_params.get('param2', [''])[0]
        print(f"param1: {param1}")
        print(f"param2: {param2}")
        self.server.shutdown()

def run_server():
    server_address = ('', 8000)
    httpd = HTTPServer(server_address, MyHandler)
    httpd.serve_forever()

run_server()
0

创建一个文件 server.py,里面写入以下内容:

import sys
port=sys.argv[1]

if sys.version_info < (3, 0):
    from SimpleHTTPServer import SimpleHTTPRequestHandler
    from BaseHTTPServer import HTTPServer
else:
    from http.server import HTTPServer, SimpleHTTPRequestHandler

httpd = HTTPServer(("127.0.0.1", int(port)), SimpleHTTPRequestHandler)
print("Serving HTTP on localhost port " + port + " (http://localhost:" + port + "/) ...")
httpd.serve_forever()

使用方法:

python server.py 8887

1

为了给出一个更通用的回答,你可以通过 subprocess 模块来调用任何外部命令:

from platform import python_version
from subprocess import call
if (int(python_version()[0]) < 3) :
    call(["python", "-m", "SimpleHTTPServer"])
else :
    call(["python", "-m", "http.server"])
16

这个被认可的答案对我没用。如果你也遇到同样的问题,可以试试这个。

from http.server import HTTPServer, SimpleHTTPRequestHandler

httpd = HTTPServer(('localhost', 8000), SimpleHTTPRequestHandler)
httpd.serve_forever()
10

下面的脚本可以在Python 2和Python 3中都能运行,效果是一样的:

try:
    # Python 2
    from SimpleHTTPServer import test, SimpleHTTPRequestHandler
except ImportError:
    # Python 3
    from http.server import test, SimpleHTTPRequestHandler

test(SimpleHTTPRequestHandler)

这个脚本运行的是一个和你在命令行中用-m选项运行模块时完全相同的功能。

Python 3的版本支持命令行参数,可以用来决定要绑定哪个接口和端口,但你的命令行其实并没有用到这些功能。

撰写回答