注意
BaseHTTPServer模块在Python3中已被合并到http.server。转换你的源码到Python3 时,2to3工具将自动适配导入。
此模块定义两个类用于实现HTTP服务器(Web 服务器)。 通常,不直接使用此模块,而是用来作为构建具有更丰富功能的Web 服务器的基础。 参见SimpleHTTPServer 和 CGIHTTPServer 模块。
第一个类HTTPServer是SocketServer.TCPServer 的一个子类,从而实现SocketServer.BaseServer 接口。它创建并监听HTTP socket,然后分配请求给处理器。创建并运行服务器的代码看起来是这样:
def run(server_class=BaseHTTPServer.HTTPServer,
handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
该类构建在TCPServer 类之上,将服务器地址保存在实例变量server_name和server_port中。该服务器可以被处理器访问,访问通常利用处理器的server 实例变量。
该类用来处理到达服务器的 HTTP 请求。它自己不能响应任何实际的 HTTP 请求;它必须被子类化来处理每个请求的方法(例如GET 和 POST)。BaseHTTPRequestHandler提供许多给子类使用的类变量、实例变量和方法。
该处理器将解析请求及其头部,然后针对特定请求类型调用一个方法。方法的名称构建自请求。例如,对于请求方法SPAM,将以不带参数的形式调用do_SPAM()方法。所有相关的信息都保存在处理器的实例变量中。子类不应该需要覆盖或者扩展__init__()方法。
BaseHTTPRequestHandler 具有以下实例变量
一个(host, port) 形式的元组,表示客户端的地址。
服务器实例。
命令(请求类型)。例如,'GET'。
请求的路径。
请求的版本字符串。例如,'HTTP/1.0'。
Holds an instance of the class specified by the MessageClass class variable. 该实例解析并管理HTTP 请求中的头信息。
输入流,起始于输入数据的开始,输入数据是可选的。
输出流,用于写入返回给客户端的响应。写入该流时,必须遵守合适的HTTP 协议。
BaseHTTPRequestHandler 具有以下类变量:
服务器的软件版本。你可能想要覆盖它。它的格式是多个空格分隔的字符串,每个字符串的形式时name[/version]。例如,'BaseHTTP/0.2'。
Python 系统的版本, 被version_string 方法使用,形式类似server_version 类变量。例如,'Python/1.4'。
用于构建返回给客户端的错误响应的格式。It uses parenthesized, keyed format specifiers, so the format operand must be a dictionary. code键应该是一个整数,表示HTTP 的错误码。message 应该是一个字符串,包含一个(详细)的错误信息,explain 应该是对错误码的一个解释。默认的 message 和explain 的值在responses 类变量中可以找到。
发送给客户端的错误响应中Content-Type HTTP 头。默认值是'text/html'。
2.6 版中新增:以前,Content-Type 始终是'text/html'。
响应中使用的HTTP 协议的版本。如果设置为'HTTP/1.1',服务器将允许HTTP 持久连接;然而,此时你的服务器必须在所有给客户端的响应中包含一个准确的Content-Length 头(使用send_header())。为了向后兼容,该设置默认为'HTTP/1.0'。
Specifies a rfc822.Message-like class to parse HTTP headers. Typically, this is not overridden, and it defaults to mimetools.Message.
该变量包含一个错误码到两个元素的元组的映射,元组包含一个短消息和一个长消息。例如,{code: (shortmessage, longmessage)}。shortmessage 通常作为错误信息中的message 键,而 longmessage 作为 explain 键(参见error_message_format 类变量)。
BaseHTTPRequestHandler 实例具有以下方法:
调用一次handle_one_request()方法(如果启用持久连接,则调用多次)来处理进来的HTTP 请求。你应该永远不会需要覆盖它;相反,应该实现合适的do_*() 方法。
该方法将解析并分发请求给合适的do_*() 方法。你应该永远不需要覆盖它。
发送一个完全的错误返回给客户端并记录日志。数字code 表示HTTP 错误码,message为可选的表示更详细信息的文本。将会发送一个完整的头部集合,加上使用error_message_format 类变量生成的文本。
发送一个响应的头部并记录接收的请求的日志。将会发送HTTP 响应行,加上Server 和 Date 头。这两个头的值分别从version_string()和date_time_string()方法获取。
向输出流写入一个特定的HTTP 头。keyword表示头的名称,value表示其值。
发送一个空白行,指示响应中HTTP 头的结束。
记录一个接收的(成功的)请求的日志。code 表示相应的HTTP 响应码。如果可以获取响应的大小,应该将它传递给size 参数。
不能完成一个请求时记录一个错误日志。默认情况下,它传递消息给log_message(),所以它加收相同的参数(format和另外的值)。
打印任意一个信息到sys.stderr。通常会覆盖这个方法来创建自定义的错误日志记录机制。format 参数是一个标准的prinf 风格的格式字符串,log_message()的额外的参数作为该格式的输入。客户端IP地址和当前的日期和时间将作为每个日志的前缀。
返回服务器软件的版本字符串。它为server_version和sys_version 类变量的组合。
返回timestamp (必须与time.time()返回的格式相同)指定的日期和时间,格式可以用于消息头。如果省略timestamp,它使用当前的日期和时间。
结构看上去像'Sun, 06 Nov 1994 08:49:37 GMT'。
2.5 版中新增:timestamp 参数。.
返回当前的日期和时间,格式用于日志记录。
返回客户端地址,格式用于日志记录。会对客户端的IP地址做一次DNS名称查询。
创建一个不会一直运行的服务器,除非满足特定的条件:
def run_while_true(server_class=BaseHTTPServer.HTTPServer,
handler_class=BaseHTTPServer.BaseHTTPRequestHandler):
"""
This assumes that keep_running() is a function of no arguments which
is tested initially and after each request. If its return value
is true, the server continues.
"""
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
while keep_running():
httpd.handle_request()
请参阅