Python3 Http网络服务器:虚拟主机

3 投票
2 回答
4246 浏览
提问于 2025-04-15 11:13

我正在用Python3写一个相当简单的HTTP网络服务器。这个服务器需要简单,只要能基本读取配置文件就行。我只使用了标准库,目前运行得还不错。

这个项目有一个要求,我自己实现不了,就是虚拟主机。我需要至少两个虚拟主机,这些主机需要在配置文件中定义。问题是,我找不到在Python中实现它们的方法。有没有人能提供一些指南、文章,或者简单的实现方法呢?

我会非常感激任何帮助。

2 个回答

11

虚拟主机的工作原理是根据HTTP请求中的Host:头部来决定的。

也就是说,只需要查看请求中的头部信息,然后根据Host:头部的值来采取相应的行动。

5

如果你想搭建一个简单的HTTP网络服务器,可以从WSGI的参考实现开始:

wsgiref是WSGI规范的一个参考实现,可以用来为网络服务器或框架添加WSGI支持。它提供了一些工具,可以用来处理WSGI环境变量和响应头,还有一些基础类,用于实现WSGI服务器,以及一个可以服务WSGI应用的演示HTTP服务器,...

下面这个例子展示了如何修改服务器,以检查HTTP_HOST头信息。这个简单的应用会根据虚拟主机的不同,返回不同的文本。(如果你想进一步扩展这个例子,可以尝试使用配置文件)

import wsgiref
from wsgiref.simple_server import make_server

def my_app(environ,start_response):
    from io import StringIO
    stdout = StringIO()
    host = environ["HTTP_HOST"].split(":")[0]
    if host == "127.0.0.1":
        print("This is virtual host 1", file=stdout)
    elif host == "localhost":
        print("This is virtual host 2", file=stdout)
    else:
        print("Unknown virtual host", file=stdout)

    print("Hello world!", file=stdout)
    print(file=stdout)
    start_response(b"200 OK", [(b'Content-Type',b'text/plain; charset=utf-8')])
    return [stdout.getvalue().encode("utf-8")]

def test1():
    httpd = make_server('', 8000, my_app)
    print("Serving HTTP on port 8000...")

    # Respond to requests until process is killed
    httpd.serve_forever()

撰写回答