http.server ---HTTP服务器

源代码: Lib/http/server.py


此模块定义用于实现HTTP服务器(Web服务器)的类。

警告

http.server 不建议用于生产。它只执行基本的安全检查。

一类, HTTPServer 是一个 socketserver.TCPServer 子类。它创建并监听HTTP套接字,将请求分派给处理程序。创建和运行服务器的代码如下所示:

def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
    server_address = ('', 8000)
    httpd = server_class(server_address, handler_class)
    httpd.serve_forever()
class http.server.HTTPServer(server_address, RequestHandlerClass)

这个课程建立在 TCPServer 通过将服务器地址存储为名为 server_nameserver_port . 服务器可由处理程序访问,通常通过处理程序的 server 实例变量。

class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)

此类与httpserver相同,但使用线程通过使用 ThreadingMixIn . 这对于处理Web浏览器预打开的套接字很有用,在该套接字上 HTTPServer 会无限期地等待。

3.7 新版功能.

这个 HTTPServerThreadingHTTPServer 必须给予 RequestHandlerClass 在实例化时,此模块提供三种不同的变体:

class http.server.BaseHTTPRequestHandler(request, client_address, server)

此类用于处理到达服务器的HTTP请求。它本身不能响应任何实际的HTTP请求;必须对其进行子类化以处理每个请求方法(例如get或post)。 BaseHTTPRequestHandler 提供许多类和实例变量以及子类使用的方法。

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

BaseHTTPRequestHandler 具有以下实例变量:

client_address

包含窗体的元组 (host, port) 指客户的地址。

server

包含服务器实例。

close_connection

应在之前设置的布尔值 handle_one_request() 返回,指示是否需要另一个请求,或者是否应关闭连接。

requestline

包含HTTP请求行的字符串表示形式。终止的CRLF被剥离。此属性应由 handle_one_request() . 如果没有处理有效的请求行,则应将其设置为空字符串。

command

包含命令(请求类型)。例如, 'GET' .

path

包含请求路径。

request_version

包含来自请求的版本字符串。例如, 'HTTP/1.0' .

headers

保留由指定的类的实例 MessageClass 类变量。此实例解析和管理HTTP请求中的头。这个 parse_headers() 函数来自 http.client 用于分析头,它要求HTTP请求提供有效的 RFC 2822 样式标题。

rfile

io.BufferedIOBase 输入流,准备从可选输入数据的开始处读取。

wfile

包含用于将响应写回客户端的输出流。在写入此流时,必须正确遵守HTTP协议,才能成功地与HTTP客户端进行互操作。

在 3.6 版更改: 这是一个 io.BufferedIOBase 溪流。

BaseHTTPRequestHandler 具有以下属性:

server_version

指定服务器软件版本。您可能想要覆盖这个。格式是多个空格分隔的字符串,其中每个字符串都是表单名称 [/version] . 例如, 'BaseHTTP/0.2' .

sys_version

包含python系统版本,格式由 version_string 方法与 server_version 类变量。例如, 'Python/1.4' .

error_message_format

指定应由使用的格式字符串 send_error() 用于生成对客户端的错误响应的方法。默认情况下,字符串由以下变量填充 responses 基于传递给的状态代码 send_error() .

error_content_type

指定发送到客户端的错误响应的内容类型HTTP头。默认值为 'text/html' .

protocol_version

这指定了响应中使用的HTTP协议版本。如果设置为 'HTTP/1.1' ,服务器将允许HTTP持久连接;但是,您的服务器 must 然后包括一个准确的 Content-Length 页眉(使用) send_header() )对客户的所有回应。为了向后兼容,设置默认为 'HTTP/1.0' .

MessageClass

指定 email.message.Message -类来解析HTTP头。通常,这不会被重写,并且默认为 http.client.HTTPMessage .

responses

此属性包含错误代码整数到包含短消息和长消息的两个元素元组的映射。例如, {{code: (shortmessage, longmessage)}} . 这个 短文故乡 通常用作 消息 输入错误响应,以及 长信息 作为 解释 关键。它被使用 send_response_only()send_error() 方法。

A BaseHTTPRequestHandler 实例具有以下方法:

handle()

调用 handle_one_request() 一次(或者,如果启用了持久连接,则多次)处理传入的HTTP请求。您不应该重写它;相反,应该适当地实现 do_*() 方法。

handle_one_request()

此方法将解析请求并将其分派给相应的 do_*() 方法。你永远不需要覆盖它。

handle_expect_100()

当符合HTTP/1.1的服务器接收到 Expect: 100-continue 请求头它用 100 Continue 然后 200 OK 标题。如果服务器不希望客户端继续,则可以重写此方法以引发错误。例如,服务器可以选择发送 417 Expectation Failed 作为响应头和 return False .

3.2 新版功能.

send_error(code, message=None, explain=None)

向客户端发送并记录完整的错误回复。数字的 code 指定HTTP错误代码,使用 消息 作为对错误的可选、简短、可读的描述。这个 解释 参数可用于提供有关错误的更详细信息;将使用 error_message_format 属性,并在一组完整的头之后作为响应主体发出。这个 responses 属性保留默认值 消息解释 如果没有提供值,则将使用该值;对于未知代码,两者的默认值都是字符串 ??? . 如果方法为head或响应代码为以下之一,则正文将为空: 1xx204 No Content205 Reset Content304 Not Modified .

在 3.4 版更改: 错误响应包括内容长度头。增加了 解释 参数。

send_response(code, message=None)

将响应头添加到头缓冲区并记录接受的请求。HTTP响应行写入内部缓冲区,然后 服务器Date 标题。这两个标题的值是从 version_string()date_time_string() 方法。如果服务器不打算使用 send_header() 方法,然后 send_response() 后面应该跟一个 end_headers() 调用。

在 3.3 版更改: 头存储在内部缓冲区中,并且 end_headers() 需要显式调用。

send_header(keyword, value)

将HTTP头添加到内部缓冲区中,该缓冲区将在以下任一情况下写入输出流 end_headers()flush_headers() 被调用。 关键字 应指定header关键字,使用 value 指定其值。注意,在发送头调用完成后, end_headers() 必须调用才能完成操作。

在 3.2 版更改: 头存储在内部缓冲区中。

send_response_only(code, message=None)

仅发送响应头,用于 100 Continue 响应由服务器发送到客户机。头文件没有缓冲并直接发送输出流。如果 消息 未指定,响应对应的HTTP消息 code 发送。

3.2 新版功能.

end_headers()

将空行(指示响应中HTTP头的结尾)添加到头缓冲区并调用 flush_headers() .

在 3.2 版更改: 缓冲的头将写入输出流。

flush_headers()

最后将头发送到输出流并刷新内部头缓冲区。

3.3 新版功能.

log_request(code='-', size='-')

记录已接受(成功)的请求。 code 应指定与响应关联的数字HTTP代码。如果响应的大小可用,则应将其作为 size 参数。

log_error(...)

当无法完成请求时记录错误。默认情况下,它将消息传递给 log_message() ,所以它采用相同的参数( 格式 以及附加值)。

log_message(format, ...)

将任意消息记录到 sys.stderr . 这通常被重写以创建自定义错误日志记录机制。这个 格式 参数是标准的printf样式格式字符串,其中 log_message() 作为格式的输入应用。客户机IP地址和当前日期和时间会在每个记录的消息前面加上前缀。

version_string()

返回服务器软件的版本字符串。这是 server_versionsys_version 属性。

date_time_string(timestamp=None)

返回给定的日期和时间 时间戳 (必须是 None 或以返回的格式 time.time() ,格式化为消息头。如果 时间戳 如果省略,则使用当前日期和时间。

结果看起来像 'Sun, 06 Nov 1994 08:49:37 GMT' .

log_date_time_string()

返回格式化为日志记录的当前日期和时间。

address_string()

返回客户端地址。

在 3.3 版更改: 以前,执行了名称查找。为了避免名称解析延迟,它现在总是返回IP地址。

class http.server.SimpleHTTPRequestHandler(request, client_address, server, directory=None)

这个类提供来自当前目录及以下目录的文件,直接将目录结构映射到HTTP请求。

许多工作,例如解析请求,都是由基类完成的。 BaseHTTPRequestHandler . 此类实现 do_GET()do_HEAD() 功能。

以下定义为 SimpleHTTPRequestHandler

server_version

这将是 "SimpleHTTP/" + __version__ 在哪里 __version__ 在模块级别定义。

extensions_map

字典将后缀映射到MIME类型,包含默认系统映射的自定义重写。映射不区分大小写,因此应该只包含小写的键。

在 3.9 版更改: 此字典不再填充默认的系统映射,而只包含重写。

directory

如果未指定,则要服务的目录是当前工作目录。

在 3.9 版更改: 接受一 path-like object .

这个 SimpleHTTPRequestHandler 类定义以下方法:

do_HEAD()

这种方法服务于 'HEAD' 请求类型:它发送将为等效项发送的头 GET 请求。见 do_GET() 方法来更完整地解释可能的头。

do_GET()

通过将请求解释为相对于当前工作目录的路径,请求被映射到本地文件。

如果请求映射到一个目录,则会检查该目录中是否存在名为 index.htmlindex.htm (按顺序)。如果找到,则返回文件的内容;否则,通过调用 list_directory() 方法。此方法使用 os.listdir() 扫描目录并返回 404 错误响应如果 listdir() 失败。

如果请求被映射到一个文件,它将被打开。任何 OSError 打开请求的文件时出现异常映射到 404'File not found' 错误。如果有 'If-Modified-Since' 请求中的头文件,并且在这段时间后未修改该文件, 304'Not Modified' 已发送响应。否则,通过调用 guess_type() 方法,然后使用 extensions_map 变量,并返回文件内容。

A 'Content-type:' 输出具有猜测内容类型的头,后跟 'Content-Length:' 带有文件大小和 'Last-Modified:' 头文件的修改时间。

然后,在一个空白行后面表示头的结尾,然后输出文件的内容。如果文件的mime类型以 text/ 文件以文本模式打开;否则使用二进制模式。

例如用法,请参见 test() 中的函数调用 http.server 模块。

在 3.7 版更改: 支持 'If-Modified-Since' 标题。

这个 SimpleHTTPRequestHandler 类可以按以下方式使用,以便创建一个非常基本的Web服务器,为与当前目录相关的文件提供服务:

import http.server
import socketserver

PORT = 8000

Handler = http.server.SimpleHTTPRequestHandler

with socketserver.TCPServer(("", PORT), Handler) as httpd:
    print("serving at port", PORT)
    httpd.serve_forever()

http.server 也可以使用 -m 使用 port number 参数。与前面的示例类似,它提供与当前目录相关的文件:

python -m http.server 8000

默认情况下,服务器将自身绑定到所有接口。选择权 -b/--bind 指定应绑定到的特定地址。支持IPv4和IPv6地址。例如,以下命令使服务器仅绑定到localhost::

python -m http.server 8000 --bind 127.0.0.1

3.4 新版功能: --bind 有人提出了参数。

3.8 新版功能: --bind 参数增强以支持IPv6

默认情况下,服务器使用当前目录。选择权 -d/--directory 指定应向其提供文件的目录。例如,以下命令使用特定目录:

python -m http.server --directory /tmp/

3.7 新版功能: --directory 指定备用目录

class http.server.CGIHTTPRequestHandler(request, client_address, server)

这个类用于服务当前目录及以下目录中CGI脚本的文件或输出。请注意,将HTTP层次结构映射到本地目录结构与 SimpleHTTPRequestHandler .

注解

由运行的CGI脚本 CGIHTTPRequestHandler 类无法执行重定向(HTTP代码302),因为在执行CGI脚本之前发送了代码200(脚本输出如下)。这会预先清空状态代码。

但是,如果类猜测它是一个CGI脚本,那么它将运行该CGI脚本,而不是将其作为文件提供。只使用基于目录的CGI——另一种常见的服务器配置是将特殊扩展视为表示CGI脚本。

这个 do_GET()do_HEAD() 如果请求导致在 cgi_directories 路径。

这个 CGIHTTPRequestHandler 定义以下数据成员:

cgi_directories

默认为 ['/cgi-bin', '/htbin'] 并描述要视为包含CGI脚本的目录。

这个 CGIHTTPRequestHandler 定义以下方法:

do_POST()

这种方法服务于 'POST' 请求类型,仅允许用于CGI脚本。尝试发布到非CGI URL时,输出错误501“can only post to CGI scripts”。

注意,出于安全考虑,CGI脚本将以用户nobody的uid运行。CGI脚本的问题将被转换为错误403。

CGIHTTPRequestHandler 可以在命令行中通过传递 --cgi 选项:

python -m http.server --cgi 8000