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_name
和server_port
. 服务器可由处理程序访问,通常通过处理程序的server
实例变量。
- class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)¶
此类与httpserver相同,但使用线程通过使用
ThreadingMixIn
. 这对于处理Web浏览器预打开的套接字很有用,在该套接字上HTTPServer
会无限期地等待。3.7 新版功能.
这个 HTTPServer
和 ThreadingHTTPServer
必须给予 RequestHandlerClass 在实例化时,此模块提供三种不同的变体:
- class http.server.BaseHTTPRequestHandler(request, client_address, server)¶
此类用于处理到达服务器的HTTP请求。它本身不能响应任何实际的HTTP请求;必须对其进行子类化以处理每个请求方法(例如get或post)。
BaseHTTPRequestHandler
提供许多类和实例变量以及子类使用的方法。处理程序将解析请求和头,然后调用特定于请求类型的方法。方法名是根据请求构造的。例如,对于请求方法
SPAM
, thedo_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或响应代码为以下之一,则正文将为空:1xx
,204 No Content
,205 Reset Content
,304 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_version
和sys_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_GET()¶
通过将请求解释为相对于当前工作目录的路径,请求被映射到本地文件。
如果请求映射到一个目录,则会检查该目录中是否存在名为
index.html
或index.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