2009-04-23 224 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:頭來工作。

只需讀取請求的報頭,並採取基於主機的價值作用:頭