20.18. BaseHTTPServer —基本的 HTTP 服务器

Note

BaseHTTPServer模块已在 Python 3 中合并到http.server中。2to3工具在将源转换为 Python 3 时将自动适应导入。

源代码: Lib/BaseHTTPServer.py


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

第一类HTTPServerSocketServer.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_nameserver_port的实例变量来构建TCPServer类。处理程序通常可以pass处理程序的server实例变量来访问服务器。
    • class * BaseHTTPServer. BaseHTTPRequestHandler(* request client_address server *)
    • 此类用于处理到达服务器的 HTTP 请求。就其本身而言,它无法响应任何实际的 HTTP 请求。必须将其子类化以处理每种请求方法(例如 GET 或 POST)。 BaseHTTPRequestHandler提供了许多类和实例变量,以及供子类使用的方法。

处理程序将解析请求和 Headers,然后调用特定于请求类型的方法。方法名称是根据请求构造的。例如,对于请求方法SPAM,将不带任何参数调用do_SPAM()方法。所有相关信息都存储在处理程序的实例变量中。子类不需要重写或扩展init()方法。

BaseHTTPRequestHandler具有以下实例变量:

  • client_address

    • 包含表示 Client 地址的(host, port)形式的 Tuples。
  • 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'
  • sys_version

  • error_message_format

    • 指定用于生成对 Client 端的错误响应的格式字符串。它使用括号括起来的键格式说明符,因此格式操作数必须是字典。 * code *键应为整数,指定数字 HTTP 错误代码值。 * message 应该是包含发生的(详细)错误消息的字符串,而 explain 应该是错误代码编号的解释。默认的 message explain 值可以在 responses *类变量中找到。
  • error_content_type

    • 指定发送到 Client 端的错误响应的 Content-Type HTTPHeaders。默认值为'text/html'

2.6 版的新Function:以前,Content Type 始终为'text/html'

  • protocol_version

    • 这指定了响应中使用的 HTTP 协议版本。如果设置为'HTTP/1.1',则服务器将允许 HTTP 持久连接;但是,您的服务器在所有对 Client 端的响应中都必须*包含一个准确的Content-LengthHeaders(使用send_header())。为了向后兼容,该设置默认为'HTTP/1.0'
  • MessageClass

  • responses
    • 此变量包含错误代码整数到包含短消息和长消息的两个元素的 Tuples 的 Map。例如{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 *])

    • 发送并记录完整的错误回复给 Client 端。数字* code 指定 HTTP 错误代码,其中 message *作为可选的更具体的文本。发送完整的标题集,然后发送使用error_message_format class 变量组成的文本。如果方法为 HEAD 或响应代码为以下值之一,则主体将为空:1xx204 No Content205 Reset Content304 Not Modified
  • 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 ( )

  • 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

  • 基本请求处理程序,用于将响应限制为实际在文档根目录下的文件。