20.8 Web(HTTP)服务器
建立一个Web服务,需要一个基本的服务器和一个处理器。
服务器的角色是在客户端和服务器端完成必要的HTTP交互,在python的BaseHTTPServer模块中找到HTTPServer的服务器基本类。
处理器是处理客户端的请求,并返回适当的文件,如静态的文本或由CGI生成的动态文件。在python标准库中,提供了三种不同的处理器。分别是BaseHTTPRequestHander、SimpleHTTPRequestHandle和CGIHTTPRequestHandler。
BaseHTTPRequestHandler在BaseHTTPServer模块中,它是最基本最普通的处理器,除了获取客户端的请求外,不执行其他处理工作,必须要自己完成。
SimpleHTTPRequestHandler在SimpleHTTPServer模块中,它基于BaseHTTPRequestHandler,可直接执行标准的GET和HEAD请求。
CGIHTTPRequestHandler在CGIHTTPServer模块中,基于SimpleHTTPRequestHandler,并为POST请求提供支持,也可调用CGI脚本完成请求过程,也可以将生成的HTML脚本返回给客户端。
书中的例20.9:
#-*-coding: utf-8-*-
from os import curdir, sep
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
class MyHandler(BaseHTTPRequestHandler):
def do_GET(self):
try:
f = open(self.path[1:], 'r') # 参考第三版的python核心编程,尝试打开客户端传来的路径(即http://localhost:80/XXX中的XXX)。
self.send_response(200) # 成功之后返回"OK"状态(200),并转发下载的web页面
self.send_header('Content-type', 'text/html') # 头文件?
self.end_headers()
self.wfile.write(f.read()) # ?
f.close()
except IOError:
self.send_error(404, 'File Not Found: %s' % self.path) # 没有成功,就返回404状态
def main():
try:
server = HTTPServer(('', 80), MyHandler) # 确定主机名为localhost,端口为80,要确保80端口不被非python程序占用,否则就会返回[Errno 10013]
print 'Welcome to the machine...'
print 'Press ^C once or twice to quit.'
server.serve_forever() # 服务器/客户端无限循环
except KeyboardInterrupt:
print '^C received, shutting down server'
server.socket.close() # 如果在终端人为输入^C,就终止服务器运行。
if __name__ == '__main__':
main()
在运行这个脚本时,要注意80端口不能让非python程序占用,否则就会返回[Errno 10013](本人之前就是被这个错误一直折腾)。按照在终端如powershell中正常程序运行,之后再在浏览器中输入http://localhost:80/XXX(XXX是要打开文件的路径)。