20.8 Web(HTTP)服务器

到现在为止,我们已经讨论了如何使用Python建立Web客户端并用CGI请求处理帮助Web服务器执行了一些工作。我们通过第20.2节和第20.3节的学习知道了Python可以用来建立简单和复杂的Web客户端,而对复杂的CGI请求没有说明。

然而,我们在这章的焦点是探索建立Web服务器。如果说Firefox、Mozilla、IE、Opera、Netscape、AOL、Safari、Camino、Epiphany、Galeon和Lynx浏览器是最流行的一些Web客户端,那么什么是最常用的Web服务器呢?它们就是Apache、Netscape IIS、thttpd、Zeus和Zope。由于这些服务器都远远超过了你的应用程序要求,这里我们使用Python建立简单但有用的Web服务器。

用Python建立Web服务器

由于已经打算建立这样的一个应用程序,很自然就需要创建个人素材,但是你将要用到的所有的基础代码都在Python的标准库中。要建立一个Web服务、一个基本的服务器和一个“处理器”是必备的。

基础的(Web)服务器是一个必备的模具。它的角色是在客户端和服务器端完成必要HTTP交互。在BaseHTTPServer模块中可以找到一个名叫HTTPServer的服务器基本类。

处理器是一些处理主要“Web服务”的简单软件。它们处理客户端的请求,并返回适当的文件,静态的文本或者由CGI生成的动态文件。处理器的复杂性决定了你的Web服务器的复杂程度。Python标准库提供了三种不同的处理器。

最基本、最普通的是vanilla处理器,被命名为BaseHTTPResquestHandler,这个可以在基本Web服务器的BaseHTTPServer模块中找到。除了获得客户端的请求外,不再执行其他的处理工作,因此你必须自己完成它们,这样就导致了myhttpd.py服务的出现。

用于SimpleHTTPServer模块中的SimpleHTTPRequestHandler建立在BaseHTTPResquestHandler基础上,直接执行标准的GET和HEAD请求。这虽然还不算完美,但已经可以完成一些简单的功能了。

最后,我们来看下用于CGIHTTPServer模块中的CGIHTTPRequestHandler处理器,它可以获取SimpleHTTPRequestHandler并为POST请求提供支持。它可以调用CGI脚本完成请求处理过程,也可以将生成的HTML脚本返回给客户端。

这三个模块和他们的类在表20.6中有描述。

为了能理解在SimpleHTTPServer和CGIHTTPServer模块中的其他高级处理器是如何工作的,我们将对BaseHTTPRequestHandler实现简单的GET处理功能。

20.8 Web(HTTP)服务器 - 图1

在例20.9中,我们展示了一个Web服务器(myhttpd.py)的全部工作代码。

这个服务的子类BaseHTTPRequestHandler只包含do_GET()方法,在基础服务器接到GET请求时被调用。尝试打开客户端传来的路径,如果实现了,将会返回”OK”状态(200),并转发下载的Web页面,否则将会返回404状态。

main()函数只是简单的将Web服务器类实例化,然后启动它进入永不停息的服务循环,如果遇到了^C中断或者类似的键输入则会将其关闭。如果你可以访问并运行这个服务器,你就会发现它会显示出一些类似这样的登录输出:

20.8 Web(HTTP)服务器 - 图2

当然,我们的Web服务器实在太简单了,它甚至还不能处理普通的文本文件。我们将这部分的解决方案留给读者研发——在本章最后的练习题中。

正如你所看到的一样,建立一个Web服务器并在纯Python脚本中运行并不会花太多时间。为你的特定应用程序定制改进处理器将需要做更多事情。请查看本部分的相关库来获得更多模块及其类的信息。

例20.9 简单Web服务器(myhttpd.py)

这个简单的Web服务器可以读取GET请求,获取Web页面(.html文件)并将其返回给客户端。它通过使用BaseHTTPServer的BaseHTTPRequestHandler处理器执行do_GET()方法来处理GET请求。

20.8 Web(HTTP)服务器 - 图3

20.8 Web(HTTP)服务器 - 图4