Веб-сервер Python3 Http: виртуальные хосты - PullRequest
3 голосов
/ 23 апреля 2009

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

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

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

Ответы [ 2 ]

10 голосов
/ 23 апреля 2009

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

Просто прочитайте заголовки запроса и выполните действие, основанное на значении Host: header

5 голосов
/ 07 июня 2009

Для простого веб-сервера HTTP вы можете начать с эталонной реализации WSGI :

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()
...