http.server是用来构建HTTP服务器(web服务器)的模块,定义了许多相关的类。
创建及运行服务器的代码一般为:
def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler):
server_address = ('', 8000)
httpd = server_class(server_address, handler_class)
httpd.serve_forever()
类HTTPServer,是TCPServer的子类,是一个socketserver。它可以创建和监听HTTP socket,向handler分发requests。
class http.server.
HTTPServer
(server_address, RequestHandlerClass)
该类基于TCPServer类,通过将服务器地址存储在实例变量中(server_name和server_port)。服务器可以通过handler连接,主要是通过handler的server实例变量。
由于HTTPServer实例化时必须接收一个RequestHandlerClass,该模块提供了三种不同的变体:
1. class http.server.
BaseHTTPRequestHandler
(request, client_address, server)
说明:此类是用于处理服务器端接收的HTTP请求。但是,它自己本身并不能对任何HTTP requests进行响应。必须将其子类化(创建一个继承它的新的类)来处理每个请求方法(GET、POST等)。
BaseHTTPRequestHandler类提供了许多类和实例变量以及用于子类的方法。
handler会解析requests和headers,然后根绝request的类型调用相应的方法。方法名是由request构建。例如:对于request方法/类型 SPAM,就会调用不传入参数的do_SPAM()方法。所有相关
信息都存储在handler的实例变量中。子类不需要被推翻(override)或者_init_()方法被重写。
BaseHTTPRequestHandler有以下实例变量:
client_address :包含客户端IP和端口号的元组
server :包含服务器实例
close_connection :布尔值,在 handle_one_request()
返回之前设定,为真就等待另一个连接,为假就关闭连接
requestline :包含HTTP请求行request line的字符串表示。行末的换行符(CRLF)会被去掉。
command :包含请求类型,如'GET'.
path :包含请求路径。
request_version :包含请求的版本号的字符串表示,如'HTTP/1.0'
headers :拥有一个由MessageClass类指定的实例,该实例解析和管理HTTP请求头部。http.client中的parse_headers()函数用于解析头部文件。
rfile :包含一个输入流,位于选择输入的数据的开端。
wfile :包含一个输出流,用于向客户端发送response。
BaseHTTPRequestHandler有下列属性:
server_version:服务器版本
sys_version:python版本
error_message_format:指定一个格式字符串,用于 send_error()
方法向客户端发送错误响应时的格式。
error_content_type:错误响应的HTTP头部中的Content-Type,默认是'text/html'.
protocol_version:指定响应中用的HTTP协议版本号,若为HTTP1.1,就允许持久连接(persitent connection),此时服务器必须在其对客户端的所有响应中包含一个准确的Content-Length头部。为了向后兼容,默认为HTTP1.0
MessageClass:指定一个解析HTTP headers的eamil.message.Message的类。
responses:该属性包含一个映射(字典),如:{code: (shortmessage, longmessage)}。code为状态码(整数),短消息一般为error response中的关键消息,长消息为其的解释。
BaseHTTPRequestHandler实例有下列方法:
handle
():处理进来的HTTP requests.不能重写此方法。
handle_one_request
():解析并分发requests至相应的do_*()方法.。不能重写此方法。
handle_expect_100
():HTTP1.1.中处理 Expect:100-continue请求。
send_error
(code, message=None, explain=None):发送并记录一个完整的错误响应给客户端。code为错误对应的HTTP状态码,message为可选的对错误的简短的描述,explain可以提供更多的细节信息。
send_response
(code, message=None):添加一个响应头至头部缓存中并记录接收的请求。当服务器不打算使用send_header()
方法发送任何其他的头部时,
send_response()后面应该紧接着显式调用
end_headers()(空行)。
send_header
(keyword, value):将HTTP头部添加至内部缓存中,当调用end_headers()或flush_headers()时就会被写入输出流中。
send_response_only
(code, message=None):当服务端的响应是100 Continue时使用该方法。
end_headers
():在头部缓冲中添加一个空行(标志着头部的结束)并调用 flush_headers()。
flush_headers
():将头部缓存发送至输出流中,并flush内部headers的缓存。
log_request
(code='-', size='-'):请求成功时进行记录。
log_message
(format, ...):记录一个任意的消息至sys.stderr.
log_error
(...):请求无法完成时记录错误。
version_string
():返回服务器软件版本的字符串表示。是 属性server_version
和 sys_version
二者的结合。
date_time_string
(timestamp=None):返回时间戳。如:'Sun, 06 Nov 1994 08:49:37 GMT'
.
log_date_time_string
():返回当前日期和时间。
address_string
():返回客户端地址。
2. class http.server.
SimpleHTTPRequestHandler
(request, client_address, server)
说明:此类用于当前路径及其子路径中的文件,直接将目录结构映射至HTTP request中。
许多工作(如解析请求)已经由基类BaseHTTPRequestHandler完成。此类添加了do_GET()和do_HEAD()函数。
The SimpleHTTPRequestHandler
class can be used in the following manner in order to create a very basic webserver serving files relative to the current directory:
import http.server
import socketserver
PORT = 8000
Handler = http.server.SimpleHTTPRequestHandler
httpd = socketserver.TCPServer(("", PORT), Handler)
print("serving at port", PORT)
httpd.serve_forever()
http.server可以通过-m开关(命令行中)和端口号直接进行调用。跟上面的例子近似, this serves files relative to the current directory:
python -m http.server 8000
默认情况下,服务器将自己绑定在所有接口上。-b/-bind选项指定一个特定的IP与服务器绑定。例如:下面的命令行将服务器绑定到localhost:
python -m http.server 8000 --bind 127.0.0.1
1.3 class http.server.
CGIHTTPRequestHandler
(request, client_address, server)
说明:此类用于当前路径下(包含子路径)的文件或者CGI脚本的输出。将HTTP层次结构映射到当前目录结构的操作与SimpleHTTPRequestHandler一样。
需要注意的是:CGIHTTPRequestHandler类运行的CGI脚本不能进行重定向(HTTP code:302),因为code 200(脚本输出)的发送会优先于CGI脚本的执行。
The do_GET()
and do_HEAD()
functions are modified to run CGI scripts and serve the output, instead of serving files, if the request leads to somewhere below the cgi_directories
path。
该类定义了一个数据成员:cgi_directories
也定义了一个方法:do_POST
() This method serves the 'POST'
request type, only allowed for CGI scripts. Error 501, “Can only POST to CGI scripts”, is output when trying to POST to a non-CGI url.
CGIHTTPRequestHandler
can be enabled in the command line by passing the --cgi
option:
python -m http.server --cgi 8000