2009-04-23 118 views
3

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

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

我将不胜感激任何帮助。

+0

问题已回答,为什么不把它标记为这样? – 2009-06-08 15:39:16

回答

5

对于一个简单的HTTP Web服务器,您可以用WSGI reference implementation开始:

的wsgiref是WSGI规范的参考实现,可用于将WSGI支持添加到Web服务器或框架。它提供了工具,用于操纵WSGI环境变量和响应头,基类实现WSGI服务器,演示HTTP服务器,供应WSGI应用,...

修改例如服务器检查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() 
+0

你不能在Python 3.0中使用所谓的WSGI参考实现,因为没有像Python 3.0的WSGI那样的东西。 WSGI 1.0规范仅支持Python 2.X.因此,使用任何声称满足WSGI规范的东西,并且与Python 3.0一起工作的人极其怀疑并理解,如果WSGI规范是针对Python 3.0发布的,那么您拥有的任何代码都可以与之前的任何代码一起使用工作。 – 2009-08-02 11:49:26

10

虚拟主机通过服从HTTP请求中的Host:头来工作。

只需读取请求的报头,并采取基于主机的价值作用:头