On this page
20.18. BaseHTTPServer —基本的 HTTP 服务器
Note
BaseHTTPServer模块已在 Python 3 中合并到http.server
中。2to3工具在将源转换为 Python 3 时将自动适应导入。
该模块定义了两个用于实现 HTTP 服务器(Web 服务器)的类。通常,不直接使用此模块,而是将其用作构建Function正常的 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 *)
- 此类pass将服务器地址存储为名为
server_name
和server_port
的实例变量来构建TCPServer
类。处理程序通常可以pass处理程序的server
实例变量来访问服务器。
- class *
-
- class *
BaseHTTPServer.
BaseHTTPRequestHandler
(* request , client_address , server *)
- 此类用于处理到达服务器的 HTTP 请求。就其本身而言,它无法响应任何实际的 HTTP 请求。必须将其子类化以处理每种请求方法(例如 GET 或 POST)。 BaseHTTPRequestHandler提供了许多类和实例变量,以及供子类使用的方法。
- class *
处理程序将解析请求和 Headers,然后调用特定于请求类型的方法。方法名称是根据请求构造的。例如,对于请求方法SPAM
,将不带任何参数调用do_SPAM()
方法。所有相关信息都存储在处理程序的实例变量中。子类不需要重写或扩展init()方法。
BaseHTTPRequestHandler具有以下实例变量:
client_address
- 包含表示 Client 地址的
(host, port)
形式的 Tuples。
- 包含表示 Client 地址的
server
- 包含服务器实例。
command
- 包含命令(请求类型)。例如
'GET'
。
- 包含命令(请求类型)。例如
path
- 包含请求路径。
request_version
- 包含请求中的版本字符串。例如
'HTTP/1.0'
。
- 包含请求中的版本字符串。例如
headers
- 包含MessageClass class 变量指定的类的实例。该实例解析并 ManagementHTTP 请求中的 Headers。
rfile
- 包含一个 Importing 流,位于可选 Importing 数据的开头。
wfile
- 包含用于将响应写回到 Client 端的输出流。写入此流时,必须使用正确的 HTTP 协议。
BaseHTTPRequestHandler具有以下类变量:
server_version
- 指定服务器软件版本。您可能要覆盖它。格式是多个用空格分隔的字符串,其中每个字符串的格式均为名称[/ version]。例如
'BaseHTTP/0.2'
。
- 指定服务器软件版本。您可能要覆盖它。格式是多个用空格分隔的字符串,其中每个字符串的格式均为名称[/ version]。例如
sys_version
- 包含 Python 系统版本,格式为version_string方法和server_version类变量可用。例如
'Python/1.4'
。
- 包含 Python 系统版本,格式为version_string方法和server_version类变量可用。例如
error_message_format
- 指定用于生成对 Client 端的错误响应的格式字符串。它使用括号括起来的键格式说明符,因此格式操作数必须是字典。 * code *键应为整数,指定数字 HTTP 错误代码值。 * message 应该是包含发生的(详细)错误消息的字符串,而 explain 应该是错误代码编号的解释。默认的 message 和 explain 值可以在 responses *类变量中找到。
error_content_type
- 指定发送到 Client 端的错误响应的 Content-Type HTTPHeaders。默认值为
'text/html'
。
- 指定发送到 Client 端的错误响应的 Content-Type HTTPHeaders。默认值为
2.6 版的新Function:以前,Content Type 始终为'text/html'
。
protocol_version
- 这指定了响应中使用的 HTTP 协议版本。如果设置为
'HTTP/1.1'
,则服务器将允许 HTTP 持久连接;但是,您的服务器在所有对 Client 端的响应中都必须*包含一个准确的Content-Length
Headers(使用send_header())。为了向后兼容,该设置默认为'HTTP/1.0'
。
- 这指定了响应中使用的 HTTP 协议版本。如果设置为
MessageClass
- 指定一个类似于rfc822.Message的类来解析 HTTPHeaders。通常,不会覆盖它,并且默认为mimetools.Message。
responses
- 此变量包含错误代码整数到包含短消息和长消息的两个元素的 Tuples 的 Map。例如
{code: (shortmessage, longmessage)}
。 * shortmessage 通常用作错误响应中的 message 键,而 longmessage 作为 explain *键(请参见error_message_format类变量)。
- 此变量包含错误代码整数到包含短消息和长消息的两个元素的 Tuples 的 Map。例如
BaseHTTPRequestHandler实例具有以下方法:
handle
( )- 一次调用handle_one_request()(或者,如果启用了持久连接,则多次调用)以处理传入的 HTTP 请求。您永远不需要覆盖它;而是实现适当的
do_*()
方法。
- 一次调用handle_one_request()(或者,如果启用了持久连接,则多次调用)以处理传入的 HTTP 请求。您永远不需要覆盖它;而是实现适当的
handle_one_request
( )- 此方法将解析请求并将其分派到适当的
do_*()
方法。您永远不需要覆盖它。
- 此方法将解析请求并将其分派到适当的
send_error
(* code * [,* message *])- 发送并记录完整的错误回复给 Client 端。数字* code 指定 HTTP 错误代码,其中 message *作为可选的更具体的文本。发送完整的标题集,然后发送使用error_message_format class 变量组成的文本。如果方法为 HEAD 或响应代码为以下值之一,则主体将为空:
1xx
,204 No Content
,205 Reset Content
,304 Not Modified
。
- 发送并记录完整的错误回复给 Client 端。数字* code 指定 HTTP 错误代码,其中 message *作为可选的更具体的文本。发送完整的标题集,然后发送使用error_message_format class 变量组成的文本。如果方法为 HEAD 或响应代码为以下值之一,则主体将为空:
send_response
(* code * [,* message *])- 发送响应 Headers 并记录接受的请求。发送 HTTP 响应行,后跟* Server 和 Date *Headers。这两个 Headers 的值分别从version_string()和date_time_string()方法中选取。
send_header
(关键字,值)- 将特定的 HTTPHeaders 写入输出流。 * keyword 应该指定 Headers 关键字, value *指定其值。
end_headers
( )- 发送空白行,指示响应中 HTTPHeaders 的结尾。
log_request
([[* code * [,* size *]])- 记录接受(成功)的请求。 * code 应该指定与响应关联的数字 HTTP 代码。如果响应的大小可用,则应将其作为 size *参数传递。
log_error
( ... )- 无法满足请求时记录错误。默认情况下,它将消息传递给log_message(),因此它采用相同的参数(* format *和其他值)。
log_message
(* format , ... *)- 将任意消息记录到
sys.stderr
。通常将其覆盖以创建自定义错误日志记录机制。 * format *参数是标准的 printf 样式格式字符串,其中log_message()的其他参数用作格式的 Importing。Client 端 ip 地址以及当前日期和时间是每个记录的消息的前缀。
- 将任意消息记录到
version_string
( )- 返回服务器软件的版本字符串。这是server_version和sys_version类变量的组合。
date_time_string
([时间戳])- 返回* timestamp (必须采用time.time()返回的格式)给定的日期和时间,其格式为消息头。如果Ellipsis timestamp *,则使用当前日期和时间。
结果看起来像'Sun, 06 Nov 1994 08:49:37 GMT'
。
2.5 版中的新Function:* timestamp *参数。
log_date_time_string
( )- 返回当前日期和时间,格式设置为日志记录。
address_string
( )- 返回 Client 端地址,格式设置为日志记录。名称查询是在 Client 端的 IP 地址上执行的。
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()
See also
Module CGIHTTPServer
支持 CGI 脚本的扩展请求处理程序。
Module SimpleHTTPServer
基本请求处理程序,用于将响应限制为实际在文档根目录下的文件。