3

我正在 python3 中编写一个相当简单的 http web 服务器。Web 服务器需要简单 - 仅从配置文件等中进行基本读取。我只使用标准库,现在它工作得相当好。

这个项目只有一个需求,我自己无法实现——虚拟主机。我需要至少有两个虚拟主机,在配置文件中定义。问题是,我找不到如何在 python 中实现它们的方法。有没有人有任何指南,文章,也许是一些简单的实现如何做到这一点?

如果有任何帮助,我将不胜感激。

4

2 回答 2

10

虚拟主机通过遵守 HTTP 请求中的 Host: 标头来工作。

只需读取请求的标头,并根据 Host: 标头的值采取行动

于 2009-04-23T12:22:59.330 回答
5

对于一个简单的 HTTP Web 服务器,您可以从WSGI 参考实现开始:

wsgiref 是 WSGI 规范的参考实现,可用于将 WSGI 支持添加到 Web 服务器或框架。它提供了用于操作 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()
于 2009-06-07T09:36:36.377 回答