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协议实现,看来还得继续深入理解。