2009-04-23 4 views
3

Я пишу довольно простой веб-сервер http в python3. Веб-сервер должен быть простым - только базовое чтение из файлов конфигурации и т. Д. Я использую только стандартные библиотеки, и на данный момент он работает довольно нормально.Python3 Http Web Server: виртуальные хосты

Существует только одно требование для этого проекта, который я не могу реализовать самостоятельно - виртуальные хосты. Мне нужно иметь как минимум два виртуальных хоста, определенных в файлах конфигурации. Проблема в том, что я не могу найти способ, как реализовать их в python. Есть ли у кого-нибудь руководства, статьи, возможно, простая реализация, как это можно сделать?

Я был бы признателен за любую помощь.

+0

Вопрос был ответ, почему бы не отметить его так? –

ответ

5

Для простого HTTP веб-сервер, вы можете начать с WSGI reference implementation:

wsgiref является эталонная реализация спецификации WSGI, которая может быть использована для добавления поддержки WSGI на веб-сервер или фреймворк. Она включает в себя утилиты для работы с переменными окружения и 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

Вы не можете использовать так называемую ссылочную реализацию WSGI для Python 3.0, поскольку WSGI для Python 3.0 не существует. Спецификация WSGI 1.0 поддерживает только Python 2.X. Таким образом, используйте все, что утверждает, что удовлетворяет спецификации WSGI и которое работает с Python 3.0 с чрезвычайным подозрением и понимает, что если спецификация WSGI когда-либо выпущена для Python 3.0, любой код, который у вас есть, работает с чем-либо до этого момента, возможно, не будет Работа. –

+2

Через 18 месяцев у py3k все еще есть wsgiref в стандартной библиотеке, http://docs.python.org/py3k/library/wsgiref.html#module-wsgiref – gimel

+0

@gimel Я влюблен в простоту этого примера. Не могли бы вы подумать о какой-либо причине не использовать это, чтобы служить небольшим проектам WSGI, а не к Gunicorn или CherryPy? Я ищу канаву apache + mod_wsgi для одного хоста, у которого нет ничего, кроме простых веб-сервисов WSGI. – DeaconDesperado

10

Виртуальные хосты работают, подчиняясь заголовку Host: в HTTP-запросе.

Просто читать заголовки запроса, и принять меры, основываясь на значении хоста: заголовок