我学习的习惯,除了学习如何使用,还喜欢研究源码,学习运行机制,这样用起来才会得心应手或者说,使用这些语言或框架,就和平时吃饭睡觉一样,非常自然;因为最近有接触到bottle和flask web框架,所以想看下这两个的源码,但是这两个框架是基于python语言自带的http,因此就有了这篇文章;
python http简单例子
python http框架主要有server和handler组成,server主要是用于建立网络模型,例如利用epoll监听socket;handler用于处理各个就绪的socket;先来看下python http简单的使用:
import sys
from http.server import HTTPServer,SimpleHTTPRequestHandler
ServerClass = HTTPServer
HandlerClass = SimpleHTTPRequestHandler
if__name__ =='__main__':
port = int(sys.argv[2])
server_address = (sys.argv[1],port)
httpd = ServerClass(server_address,HandlerClass)
sa=httpd.socket.getsockname()print("Serving HTTP on",sa[0],"port",sa[1],"...")
try:
httpd.serve_forever()
except KeyboardInterrupt:print("\nKeyboard interrupt received, exiting.")
httpd.server_close()
sys.exit(0)
运行上述例子,可以得到如下:
python3 myhttp.py 127.0.0.1 9999
此时如果在当前文件夹新建一个index.html文件,就可以通过 http://127.0.0.1:9999/index.html 访问了index.html页面了。
这个例子的server类用的是HTTPServer,handler类是SimpleHTTPRequestHandler,因此当HTTPServer监听到有request到来时,就把这个request丢给SimpleHTTPRequestHandler类求处理;ok,了解这些之后,我们开始分别分析下server和handler.
http之server
http模块的设计充分利用了面向对象的继承多态,因为之前有看了会tfs文件系统的代码,所以再看python http时,没那么大的压力;先给出server的继承关系
+------------------+
+------------+| tcpserver基类 |
| BaseServer +-------->| 开启事件循环监听 |
+-----+------+ | 处理客户端请求 |
| +------------------+
v +-----------------+
+------------+| httpserver基类 |
| TCPServer +-------->+设置监听socket |
+-----+------+ | 开启监听 |
| +-----------------+
v
+------------+
| HTTPServer |
+------------+
继承关系如上图所示,其中BaseServer和TCPServer在文件socketserver.py,HTTPServer在http/server.py;我们先看下来BaseServer;
BaseServer
因为BaseServer是所有server的基类,因此BaseServer尽可能抽象出所有server的共性,例如开启事件监听循环