20.18. BaseHTTPServer — 简单的HTTP 服务器

注意

BaseHTTPServer模块在Python3中已被合并到http.server转换你的源码到Python3 时,2to3工具将自动适配导入。

源码: Lib/BaseHTTPServer.py


此模块定义两个类用于实现HTTP服务器(Web 服务器)。 通常,不直接使用此模块,而是用来作为构建具有更丰富功能的Web 服务器的基础。 参见SimpleHTTPServerCGIHTTPServer 模块。

第一个类HTTPServerSocketServer.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()
class BaseHTTPServer.HTTPServer(server_address, RequestHandlerClass)

该类构建在TCPServer 类之上,将服务器地址保存在实例变量server_nameserver_port中。该服务器可以被处理器访问,访问通常利用处理器的server 实例变量。

class BaseHTTPServer.BaseHTTPRequestHandler(request, client_address, server)

该类用来处理到达服务器的 HTTP 请求。它自己不能响应任何实际的 HTTP 请求;它必须被子类化来处理每个请求的方法(例如GET 和 POST)。BaseHTTPRequestHandler提供许多给子类使用的类变量、实例变量和方法。

该处理器将解析请求及其头部,然后针对特定请求类型调用一个方法。方法的名称构建自请求。例如,对于请求方法SPAM,将以不带参数的形式调用do_SPAM()方法。所有相关的信息都保存在处理器的实例变量中。子类不应该需要覆盖或者扩展__init__()方法。

BaseHTTPRequestHandler 具有以下实例变量

client_address

一个(host, port) 形式的元组,表示客户端的地址。

server

服务器实例。

command

命令(请求类型)。例如,'GET'

path

请求的路径。

request_version

请求的版本字符串。例如,'HTTP/1.0'

headers

Holds an instance of the class specified by the MessageClass class variable. 该实例解析并管理HTTP 请求中的头信息。

rfile

输入流,起始于输入数据的开始,输入数据是可选的。

wfile

输出流,用于写入返回给客户端的响应。写入该流时,必须遵守合适的HTTP 协议。

BaseHTTPRequestHandler 具有以下类变量:

server_version

服务器的软件版本。你可能想要覆盖它。它的格式是多个空格分隔的字符串,每个字符串的形式时name[/version]。例如,'BaseHTTP/0.2'

sys_version

Python 系统的版本, 被version_string 方法使用,形式类似server_version 类变量。例如,'Python/1.4'

error_message_format

用于构建返回给客户端的错误响应的格式。It uses parenthesized, keyed format specifiers, so the format operand must be a dictionary. code键应该是一个整数,表示HTTP 的错误码。message 应该是一个字符串,包含一个(详细)的错误信息,explain 应该是对错误码的一个解释。默认的 messageexplain 的值在responses 类变量中可以找到。

error_content_type

发送给客户端的错误响应中Content-Type HTTP 头。默认值是'text/html'

2.6 版中新增:以前,Content-Type 始终是'text/html'

protocol_version

响应中使用的HTTP 协议的版本。如果设置为'HTTP/1.1',服务器将允许HTTP 持久连接;然而,此时你的服务器必须在所有给客户端的响应中包含一个准确的Content-Length 头(使用send_header())。为了向后兼容,该设置默认为'HTTP/1.0'

MessageClass

Specifies a rfc822.Message-like class to parse HTTP headers. Typically, this is not overridden, and it defaults to mimetools.Message.

responses

该变量包含一个错误码到两个元素的元组的映射,元组包含一个短消息和一个长消息。例如,{code: (shortmessage, longmessage)}shortmessage 通常作为错误信息中的message 键,而 longmessage 作为 explain 键(参见error_message_format 类变量)。

BaseHTTPRequestHandler 实例具有以下方法:

handle()

调用一次handle_one_request()方法(如果启用持久连接,则调用多次)来处理进来的HTTP 请求。你应该永远不会需要覆盖它;相反,应该实现合适的do_*() 方法。

handle_one_request()

该方法将解析并分发请求给合适的do_*() 方法。你应该永远不需要覆盖它。

send_error(code[, message])

发送一个完全的错误返回给客户端并记录日志。数字code 表示HTTP 错误码,message为可选的表示更详细信息的文本。将会发送一个完整的头部集合,加上使用error_message_format 类变量生成的文本。

send_response(code[, message])

发送一个响应的头部并记录接收的请求的日志。将会发送HTTP 响应行,加上ServerDate 头。这两个头的值分别从version_string()date_time_string()方法获取。

send_header(keyword, value)

向输出流写入一个特定的HTTP 头。keyword表示头的名称,value表示其值。

end_headers()

发送一个空白行,指示响应中HTTP 头的结束。

log_request([code[, size]])

记录一个接收的(成功的)请求的日志。code 表示相应的HTTP 响应码。如果可以获取响应的大小,应该将它传递给size 参数。

log_error(...)

不能完成一个请求时记录一个错误日志。默认情况下,它传递消息给log_message(),所以它加收相同的参数(format和另外的值)。

log_message(format, ...)

打印任意一个信息到sys.stderr通常会覆盖这个方法来创建自定义的错误日志记录机制。format 参数是一个标准的prinf 风格的格式字符串,log_message()的额外的参数作为该格式的输入。客户端IP地址和当前的日期和时间将作为每个日志的前缀。

version_string()

返回服务器软件的版本字符串。它为server_versionsys_version 类变量的组合。

date_time_string([timestamp])

返回timestamp (必须与time.time()返回的格式相同)指定的日期和时间,格式可以用于消息头。如果省略timestamp,它使用当前的日期和时间。

结构看上去像'Sun, 06 Nov 1994 08:49:37 GMT'

2.5 版中新增:timestamp 参数。.

log_date_time_string()

返回当前的日期和时间,格式用于日志记录。

address_string()

返回客户端地址,格式用于日志记录。会对客户端的IP地址做一次DNS名称查询。

20.18.1. 示例

创建一个不会一直运行的服务器,除非满足特定的条件:

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()

请参阅

模块 CGIHTTPServer
扩展的请求处理器,支持CGI 脚本。
模块 SimpleHTTPServer
基本的请求处理器,限制响应为文档根目录下真实存在的文件。