您的位置:首页 > 理论基础 > 计算机网络

Python http.server源码剖析(一)

2017-06-17 14:46 411 查看
利用http.server创建的web server由两部分组成:
HTTPServer
class和request handler class

HTTPServer
class负责listen和接收请求,对于每个web service是相同的,直接使用http.server模块中内置的就好;

request handler class负责处理具体的请求,对于每个web server是不同的,需要自己定义

利用http.server创建的web server的步骤通常是

定义subclass of
http.server.BaseHTTPRequestHandler
. 即handler class.

handler class中为每个HTTP verb(GET, POST等) 建立相应的method,method名采用形如
do_GET
的形式

创建
http.server.HTTPServer
的instance, 自己定义的handler class and server information — particularly, the port number.

调用
HTTPServer
instance的
serve_forever
method.

那么
HTTPServer
是如何将接受到的请求交给request handler class中对应的method处理的呢?


本文主要介绍这个以及一些其他细节



HTTPServer serve_forever
后就利用
select
判断是否有请求到来,如有则调用其
_handle_request_noblock
–>
process_request
–>
finish_request


finish_request
中会instantiating RequestHandlerClass,即调用自己定义handler class的
__init__
,在
__init__
会调用handler class的
handle
方法–>
handle_one_request


在handler class的
handle_one_request
中,首先
parse_request()
,根据request中的request line来构建一个method name
mname = 'do_' + self.command
,这就是为什么在handler class中定义的方法名需要采用形如
do_GET
的形式。

随后判断handler class中有无名为
mname
的方法,如有,则调用它;至此
HTTPServer
终于将接受到的请求交给request handler class中对应的method处理了。

其他细节

在instantiating HTTPServer的时候需要提供
server_address


server_address = ('', 8000)
server_address = ('0.0.0.0', 8000)
# 以上两种ip address等价,意味every IPv4 address on this computer". includes the localhost address, but it also includes your computer's regular IP address.


关于0.0.0.0地址的解释

0.0.0.0

Socket families

Socket Programming HOWTO
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息