Python 标准库 BaseHTTPServer 中文翻译。
注意: BaseHTTPServer模块在Python3中已被合并到http.server,当转换你的资源为 Python3 时 2to3 工具将自动适配导入。
此模块定义了两个类用于实现HTTP服务器(Web servers)。通常,此模块不被直接使用,但是它用来作为基类创建功能性的Web servers。查看 SimpleHTTPServer 和 CGIHTTPServer 模块。
第一个类,HTTPServer,是一个 SocketServer.TCPServer 的子类,因此实现 SocketServer.BaseServer 的接口,它创建和监听 HTTP socket,分配请求和处理,创建和运行server的代码看起来是这样的:
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_name 和 server_port,
服务器可经由处理者进入,典型的是通过处理者的 server 实例变量。
class BaseHTTPServer.BaseHTTPRequestHandler(request, client_address, server)
这个类用来处理到达服务器的 HTTP 请求,通过它自身,它不能响应任何实际的 HTTP 请求。它必须子类化来处理每个请求方法(例如:GET 或 POST)。BaseHTTPRequestHandler 提供一个若干类和实例变量,和可以通过子类使用的方法。
处理者将解析请求和头信息,然后调用一个请求类型的特定方法。方法名从请求构造。例子中,对于请求方法
SPAM
,do_SPAM()
方法将会无参数调用。所有相关的信息被储存进处理者的实例变量。子类应该不需要覆写或者扩展 __init__ 方法。
BaseHTTPServerHandler 有下列实例变量:
client_address
包含一个关于客户端地址的结构为 (host, port)
的元祖。
server
包含server实例
command
包含命令(请求类型),例子:'GET'
。
path
包含请求路径
request_version
包含请求的HTTP版本的字符串,例子:'HTTP/1.0'
。
headers
拥有一个通过 MessageClass 变量指定的类实例。这个实例解析和管理 HTTP 请求的头信息。
rfile
包含一个输入流 stream,放置在输入数据选项的开始。
wfile
包含输出流用于回复一个响应response给客户端client。当写入这些stream时必须使用适当的HTTP协议。
BaseHTTPRequestHandler 有下列类变量:
server_vesion
指定服务器版本,你也许会覆写它。he format is multiple whitespace-separated strings, where each string is of the form name[/version],例子:'BaseHTTP/0.2'
。
sys_version
包含Python版本,通过 version_string 方法和 server_version 类变量使用。例子:'Python/1.4'
。
error_message_format
指定一个格式化字符串用于创建一个错误响应给客户端。它使用弧括号,键格式指定,所以格式操作数必须是一个字典。code key 应该是一个整数,指定HTTP错误码值。message 应该是一个字符串包含一个错误信息的细节,explain 应该是一个错误码数字的解释。缺省 message 和 explain 的值能在 responses 类变量中被找到。
error_content_type
指定错误响应的 Content-Type HTTP 头发送给客户端,缺省值是 'text/html'
。
2.6新增,在以前,内容类型总是 'text/html'
protocol_version
这个指定的HTTP协议版本用于响应,如果设置 'HTTP/1.1'
,服务器会运行HTTP硬连接;无论如何,你的服务器必须包含一个精确的 Content-Length
头(使用 send_header())在所有它响应的客户端中。为了向后兼容,默认设置为 'HTTP/1.0'
。
MessageClass
指定一个 rfc822.Message-like 类来解析HTTP头。典型的,这不用覆写,缺省设置 mimetools.Message 。
responses
此变量包含一个错误码数字和一个包含短和长信息的2元祖的映射,例子: {code:(shrotmessage, longmessage)}
。shortmessage 通常用于一个错误响应中的 message key,longmessage用来解释(查看 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响应行被发送,然后是 Server 和 Data 头,这两个头的值分别从 version_string 和 dare_time_string 方法拾起。
send_header(keyword, value)
向输出流写入一个指定的HTTP头,ketword 应该指定头关键字,value 指定它的值。
end_headers()
发送一个空白行,表面HTTP头响应结束。
log_request([code[,size]])
记录和接受(成功的)请求,code 应该指定为 HTTP code 和响应通讯,如果响应大小是有效的,应该作为 size 参数。
log_error(…)
当一个请求不能被履行记录一个错误,缺省, 它把信息传给 log_message(),所以它获得同样的参数(格式的和附加的值)。
log_message(format, …)
记录一个任意的信息给 sys.tederr,这是典型的覆写来创建定制错误信息的原理。format参数是一个标准的 printf-style 格式化字符串,在其他参数 log_message() 被用作输入的格式。客户端ip地址和当前日期和时间作为每一个信息记录(message logged)的前缀。
version_string()
返回服务器软件版本,这是一个 server_version 和 sys_version 类变量的组合。
date_time_string([timestamp])
返回由 timestramp 给予的日期和时间(这些必须通过 time.time() 格式返回),通过一个信息头来格式化,如果 timestamp 被省略,它将使用当前的日期和时间。
结果看上去像 'Sun, 06 Nov 1994 08:49:37 GMT'
。
2.5新增 timestamp 参数。
log_date_time_string()
返回当前日期和时间,logging格式。
address_string()
返回客户端地址,logging格式,在客户端IP地址执行一个名字查找。
更多例子
创建一个不用一直循环运行的服务器,直到某些条件被满足。
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
实际上根文档(document root)下限制响应到文件的基础请求处理。