Python3 Http网络服务器:虚拟主机
我正在用Python3写一个相当简单的HTTP网络服务器。这个服务器需要简单,只要能基本读取配置文件就行。我只使用了标准库,目前运行得还不错。
这个项目有一个要求,我自己实现不了,就是虚拟主机。我需要至少两个虚拟主机,这些主机需要在配置文件中定义。问题是,我找不到在Python中实现它们的方法。有没有人能提供一些指南、文章,或者简单的实现方法呢?
我会非常感激任何帮助。
2 个回答
11
虚拟主机的工作原理是根据HTTP请求中的Host:头部来决定的。
也就是说,只需要查看请求中的头部信息,然后根据Host:头部的值来采取相应的行动。
5
如果你想搭建一个简单的HTTP网络服务器,可以从WSGI的参考实现开始:
wsgiref是WSGI规范的一个参考实现,可以用来为网络服务器或框架添加WSGI支持。它提供了一些工具,可以用来处理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()