BaseHTTPServer

注意

BaseHTTPServer模块已被合并到Python 3中。当将源代码转换为Python 3时http.server2to3工具将自动适应导入。

该模块为实现HTTP服务器(Web服务器)定义了两个类。通常,这个模块不是直接使用,而是作为构建正常运行的Web服务器的基础。请参阅SimpleHTTPServerCGIHTTPServer模块。

第一个类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_nameand的实例变量来构建类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或响应代码是下面中的一个:1xx204 No Content205 Reset Content304 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_versionsys_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()

扫码关注云+社区

领取腾讯云代金券