BaseHTTPServer¶
注解
本模块针对的是 HTTP 协议。
BaseHTTPServer
模块定义了两个类,用于构造 HTTP 服务器。
通常这两个类不直接拿来使用,而作为基类进行派生。
BaseHTTPServer.HTTPServer(server_address, RequestHandlerClass)
SocketServer.TCPServer
的子类,实现了SocketServer.BaseServer
的接口。HTTPServer
创建和监听HTTP socket
,分发请求给处理器。创建和运行服务器的代码示例:
1 2 3 4
def run(server_class=BaseHTTPServer.HTTPServer, handler_class=BaseHTTPServer.BaseHTTPRequestHandler): server_address = ('', 3000) httpd = server_class(server_address, handler_class) httpd.serve_forever()
构造函数参数说明:
- server_address 二元组
(server_name, server-port)
; 如果server_name
是 ‘’,表示服务器为本主机。 - RequestHandlerClass 请求处理器类名,可以传递
BaseHTTPServer.BaseHTTPRequestHandler
。
- server_address 二元组
BaseHTTPServer.BaseHTTPRequestHandler
定义处理器对象,用于解析服务器接收的 HTTP 请求。 它的实例不参与解析 HTTP 请求,一般是通过它的子类实例来完成。
处理器解析请求和头信息之后,调用与请求类型对应的方法。 例如:请求类型为
SPAM
,则对应的方法为do_SPAM()
。 该方法不带任何参数。重要
BaseHTTPServer.BaseHTTPRequestHandler
的子类不需要修改__init__()
方法。
BaseHTTPRequestHandler
的实例变量¶
client_address
是一个二元组(host, port)
,表示客户端主机地址server
BaseHTTPServer
实例command
请求类型,如GET
path
请求路径例如:客户端请求 URL 为:
http://127.0.0.1:2000/search?name=huwz&pwd=123456
,则 path 为/search?name=huwz&pwd=123456
。request_version
请求的协议版本,例如:HTTP/1.0
headers
类变量 MessageClass<message_class>` 的值是一个类对象。
headers
就是这个类对象的实例,用于解析和管理 HTTP 请求头。rfile
输入流,指向用户请求中附带数据的起始位置wfile
输出流,指向服务器响应数据的起始位置,返回给客户端
BaseHTTPRequestHandler
的类变量¶
server_version
表示服务器软件版本,可以修改它的值;
server_version
由多个字符串构成,字符串之间以空格隔开。 每个字符串的格式:<name>[/<version>]
,例如:BaseHTTP/0.2
sys_version
表示 Python 系统版本,采取
server_version
或者version_string()
支持的格式。如Python/1.4
。error_message_format
指定一个格式化字符串,用于构建错误响应消息,发送给客户端。
其中:
code
是整数,表示 HTTP 错误码;message
为错误简略信息,explain
为错误详细解释。默认的
message
和explain
可以从类变量responses
中获取。error_content_type
指定服务器错误响应头的
Content-Type
值。 默认值为text/html
。protocol_version
定义服务器响应的 HTTP 协议版本。 如果设为
HTTP/1.1
,则服务器允许 HTTP 长连接; 服务器所有响应的 HTTP 头必须设置准确的Content-Length
(send_header()
)。 出于后向兼容的考虑,默认版本为HTTP/1.0
。
MessageClass
表示仿
rfc822.Message
类,用于解析 HTTP 头。 默认值为mimetools.Message
,子类一般不会修改它。resposnes
{code:(shormessage, longmessage)}
它是一个字典,表示错误码到
(短信息, 长信息)
的映射(符合error_message_format
指定的格式)。
BaseHTTPRequestHandler
的方法¶
handle()
处理接收的 HTTP 请求,会调用一次
handle_one_request()
,启动长连接之后,会调用多次。 子类不用修改它;只要实现合适的do_*()
方法即可。handle_one_request()
解析和分发请求到合适的
do_*()
方法中。 子类不用修改它。send_error(code[,message])
发送错误码和错误信息给客户端。
code
表示 HTTP 错误码;message
是可选的。发完头信息之后,发送错误信息文本(由
error_message_format
构建)。send_response(code[,message])
发送一个响应头(类似于
HTTP/1.1 200 OK
),打印与接收请求相关的日志; 之后发送服务器头(version_string()
)和数据头(data_time_string()
)。send_header(keyword, value)
给输出流的 HTTP 头增加一个键值对。
end_headers()
给输出流的 HTTP 头增加一个空白行,表示结束
log_request([code][,size])
成功接收请求时,打印日志到标准输出流。
code
为 HTTP 响应状态码;size
表示响应消息体的长度。log_error(...)
不能完成请求时,打印错误日志。 默认情况下,将信息传递给
log_message()
。log_message(format, ...)
将任意信息发送给
sys.stderr
。每个打印消息都会在前面加上客户端的 ip 地址,当前日期和时间。
version_string()
返回服务器软件版本字符串; 由
server_version
和sys_version
组合而成。date_time_string([timestamp])
返回指定时间戳(
time.time()
)的日期和时间;用于消息头。如果参数
timestamp
省略,则使用当前日期和时间。其格式类似于:
Sun, 08 Feb 2015 23:09:30 GMT
log_date_time_string()
返回当前日期和时间,用于日志打印。
address_string()
返回客户端的地址,用于日志打印。 主机名称通过客户端 IP 地址查找。
注解
log_message()
内部调用 log_data_time_string()
和 address_string()
方法