BaseHTTPServer
BaseHTTPServer — Basic HTTP server
注意
该BaseHTTPServer
模块已被合并到Python 3中。当将源代码转换为Python 3时http.server
,2to3工具将自动适应导入。
源代码:
Lib / BaseHTTPServer.py
该模块为实现HTTP服务器(Web服务器)定义了两个类。通常,这个模块不是直接使用,而是作为构建正常运行的Web服务器的基础。请参阅SimpleHTTPServer
和CGIHTTPServer
模块。
第一个类HTTPServer
是,是一个SocketServer.TCPServer
子类,因此实现了SocketServer.BaseServer
接口。它创建并侦听HTTP套接字,将请求分派给处理程序。创建和运行服务器的代码如下所示:
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
and的实例变量来构建类server_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
保存由MessageClass
类变量指定的类的实例。这个实例解析并管理HTTP请求中的头文件。
rfile
包含一个输入流,位于可选输入数据的开始位置。
wfile
包含用于将响应写回客户端的输出流。写入此流时必须正确遵守HTTP协议。
BaseHTTPRequestHandler
有以下类变量:
server_version
指定服务器软件版本。你可能想重写这个。格式是多个以空格分隔的字符串,其中每个字符串的格式为名称/版本。例如,'BaseHTTP/0.2'
。
sys_version
包含Python系统版本,可以通过version_string
方法和server_version
类变量使用。例如,'Python/1.4'
。
error_message_format
指定用于构建对客户端的错误响应
的格式字符串。它使用了加括号的键控格式说明符,因此格式操作数必须是字典。该代码
键应该是一个整数,指定数字HTTP错误代码
值。消息
应该是一个字符串,其中包含所发生事件的(详细)错误消息
,解释
应该是对错误代码
编号的解释
。默认消息
和解释
值可以在响应
类变量中找到。
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
的类来解析HTTP标头。通常情况下,这不会被覆盖,并且默认为mimetools.Message
。
responses
该变量包含错误代码整数到包含短消息
和长消息
的两元素元组的映射。例如,{code: (shortmessage, longmessage)}
。的短消息
通常被用作所述消息
中的错误响应密钥,并且longmessage
作为解释
键(见error_message_format
类变量)。
一个BaseHTTPRequestHandler
实例有以下方法:
handle()
调用handle_one_request()
一次(或者,如果启用了持续连接,则会多次)来处理传入的HTTP请求。你永远不需要重写它; 相反,实施适当的do_*()
方法。
handle_one_request()
此方法将解析并将请求分发给适当的do_*()
方法。你永远不需要重写它。
send_error(code[, message])
将完整的错误回复发送并记录到客户端。数字代码
指定HTTP错误代码
,消息
为可选,更具体的文本。一组完整的标题被发送,随后是使用error_message_format
类变量组成的文本。身体将是空的,如果该方法是HEAD或响应代码
是下面中的一个:1xx
,204 No Content
,205 Reset Content
,304 Not Modified
。
send_response(code[, message])
发送响应头并记录接受的请求。发送HTTP响应行,然后发送服务器
和日期
标题。这两个头文件的值分别从version_string()
和date_time_string()
方法中获取。
send_header(keyword, value)
将特定的HTTP标头写入输出流。关键字
应该指定的标题关键字
,具有值
指定其值
。
end_headers()
发送一个空行,指示响应中HTTP标头的结尾。
log_request([code[, size]])
记录已接受(成功)的请求。代码
应该指定与响应关联的数字HTTP代码
。如果响应的大小
可用,那么它应该作为大小
参数传递。
log_error(...)
当请求无法完成时记录错误。默认情况下,它将消息传递给log_message()
,因此它采用相同的参数(格式
和附加值)。
log_message(format, ...)
将任意消息记录到sys.stderr
。这通常被重写以创建自定义错误记录机制。的格式
的参数是一个标准的printf风格格式
的字符串,其中所述附加参数log_message()
被应用作为输入的格式
。客户端IP地址和当前日期和时间以每个记录的消息为前缀。
version_string()
返回服务器软件的版本字符串。这是server_version
和sys_version
类变量的组合。
date_time_string([timestamp])
返回由时间戳
(必须采用格式返回的格式time.time()
)给出的日期和时间,格式化为邮件标题。如果时间戳
被省略,它使用当前的日期和时间。
结果看起来像'Sun, 06 Nov 1994 08:49:37 GMT'
。
2.5版新增功能:时间戳
参数。
log_date_time_string()
返回格式化为日志记录的当前日期和时间。
address_string()
返回格式化为日志记录的客户端地址。在客户端的IP地址上执行名称查找。
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()