《Head First Python》第260页中介绍的支持CGI的web服务器的编写适合python3,不巧我的是Python2,亲测不行,类库并不一致!原因是:
在Python 3.x中,BaseHTTPServer, SimpleHTTPServer, CGIHTTPServer整合到http.server包,SocketServer改名为socketserver,请注意查阅官方文档
1.CGIHTTPServer的功能作用
CGIHTTPServer包中的CGIHTTPRequestHandler类继承自SimpleHTTPRequestHandler类,所以可以用来代替上面的例子,来提供静态文件的服务。此外,CGIHTTPRequestHandler类还可以用来运行CGI脚本。
先看看什么是CGI (Common Gateway Interface)。
CGI是服务器和应用脚本之间的一套接口标准。它的功能是让服务器程序运行脚本程序,将程序的输出作为response发送给客户。总体的效果,是允许服务器动态的生成回复内容,而不必局限于静态文件。
运行原理:
支持CGI的服务器程接收到客户的请求,根据请求中的URL,运行对应的脚本文件。服务器会将HTTP请求的信息和socket信息传递给脚本文件,并等待脚本的输出。脚本的输出封装成合法的HTTP回复,发送给客户。CGI可以充分发挥服务器的可编程性,让服务器变得“更聪明”。
服务器和CGI脚本之间的通信要符合CGI标准。CGI的实现方式有很多,比如说使用Apache服务器与Perl写的CGI脚本,或者Python服务器与shell写的CGI脚本。
2.代码实现
2.1Python3 CGIweb服务器
from http.server import HTTPServer, CGIHTTPRequestHandler
last
port = 8000
httpd = HTTPServer(('', port), CGIHTTPRequestHandler)
print("Starting simple_httpd on port: " + str(httpd.server_port))
httpd.serve_forever()
2.2 Python2 CGIweb服务器
import BaseHTTPServer
import CGIHTTPServer
Host = ''
port = 8000
#create the server, CGIHTTPRequestHandler is pre-defined
handler
server = BaseHTTPServer.HTTPServer((Host,port),CGIHTTPServer.CGIHTTPRequestHandler)
#Start the server
server.serve_forever()
3 服务器调试
一定要先切换到服务器所在目录下,再运行服务器程序!!否则会出错!
如下图:
正确的做法:
4 总结
一定要注意执行服务器程序的路径问题。