python 标准库之 http.server
今天下午主要是陪我闺女,组装完成一个桌面足球,很开心的一下午。
孩子的童年只有一次,有时间多陪陪孩子吧。
python 标准库 http.server
从python2时代开始 SimpleHttpServer就陪伴我走过那些快乐的时光。可以自己建立一个简单的文件服务器,让同事们通过浏览器就可以访问我电脑上的资源,而不需要http server或者 ftp软件。
到了python3时代,这个模块被合并进了http.server。
这个模块定义了实现 HTTP 服务器( Web 服务器)的类 。
HTTPServer
是 socketserver.TCPServer
的一个子类。它会创建和侦听 HTTP 套接字,并将请求调度给处理程序。用于创建和运行服务器的代码看起来像这样
1 | def run(server_class=HTTPServer, handler_class=BaseHTTPRequestHandler): |
核心类
class http.server.HTTPServer(server_address, RequestHandlerClass)
该类基于
TCPServer
类,并会将服务器地址存入名为server_name
和server_port
的实例变量中。服务器可被处理程序通过server
实例变量访问。
class http.server.ThreadingHTTPServer(server_address, RequestHandlerClass)
根据官方说明,这是一个基于
ThreadingMixIn
的类,主要功能是使用线程处理请求。
实例变量
BaseHTTPRequestHandler
has the following instance variables:
client_address
包含指向客户地址的元组类型数据(host,port)
server
包含Server实例
close_connection
返回一个Boolean类型数据,在
handle_one_request()
,表明另一个请求开始,或者当前请求关闭。requestline
包含http请求行,. 这个属性应该用
handle_one_request()
设置. 如果一个不存在的请求被执行,应将其设置成空字符串。command
包含Http请求类型,例如:’Get’
path
包含请求url路径
request_version
包含请求的版本,例如:’ HTTP/1.0 ‘
headers
包含通过
MessageClass
类声明的变量。实例会转化为http请求。http.client
中parse_headers()
方法可以验证一个非法的请求头,参照 RFC 2822 中请求头说明。rfile
一个
io.BufferedIOBase
输入流对象,读取可能输入数据。wfile
根据客户端请求,返回数据
实例属性
server_version
格式化输出服务器版本信息,例如
'BaseHTTP/0.2'
.sys_version
包含系统版本,使用
version_string
方法和server_version
类变量,例如:'Python/1.4'
.error_message_format
声明错误信息
error_content_type
声明错误上下文类型默认值是
'text/html'
.protocol_version
声明HTTP协议版本,例如:
'HTTP/1.1'
, 服务器会保持连接。MessageClass
声明
email.message.Message
](https://docs.python.org/zh-cn/3.8/library/email.compat32-message.html#email.message.Message)-like 类处理请求头。通常不用重写,默认指向http.client.HTTPMessage
属性。.responses
回应 通常使用
send_response_only()
和send_error()
方法实现。
实例方法
handle
()调用
handle_one_request()
方法一次(如果保持连接,会调用多次) 来管理http请求。. 此方法不需要重写,除此以外,可以重写do_*()
等方法实现处理请求。handle_one_request
()此方法不需要重写,实现处理
do_*()
等方法.handle_expect_100
()当 HTTP/1.1 请求时,服务器期望返回 100-continue 并返回
200
响应码。如果想拒绝客户端连接,会抛出一个异常。send_error
(code, message=None, explain=None)send_response
(code, message=None)send_header
(keyword, value)send_response_only
(code, message=None)end_headers
()flush_headers
()log_request
(code=’-‘, size=’-‘)log_error
(…)log_message
(format, …)version_string
()date_time_string
(timestamp=None)log_date_time_string
()address_string
()
创建一个简易服务器
例如下面的代码:
1 | import http.server |
当然也可以通过命令行方式创建,例如:
1 | python -m http.server 8000 |
默认绑定本机的ip地址。
当然你可以指定一个ip地址,加入--bind
参数
1 | python -m http.server 8000 --bind 127.0.0.1 |
3.8 新增 支持绑定ipv6地址
3.7 新增支持绑定一个cgi程序,例如
1 | python -m http.server --cgi 8000 |
一个具体应用的实例
1 | #!/usr/bin/env python |
备注: 此处wfile.write
方法 需要转成 byte类型,
可以参考stackoverflow上的关于这个问题的讨论::
python-3-x-basehttpserver-or-http-server
小结
看完http.server 深有感触,一个简单的服务器学习了这么多http协议实现,看来还得继续深入理解。