HTTPServer主要是对传输控制层HTTP,TCP,Socket等底层实现细节的一些抽象,典型应用为WSGIServer,其继承关系为: WSGIServer: HTTPServer: TCPServer: SocketServer.BaseServer,对应的类视图以下图:python
RequestHandler是对HTTP请求全部操做的抽象,从其成员函数:headers, response, parse_request(), handle_one_request()等便可大体了解其主要工做内容,其典型的应用是WSGIRequestHandler,对应的继承关系为: WSGIRequestHandler: BaseHTTPRequestHander: StreamRequestHandler: SocketServer.BaseRequestHandler。对应的类视图以下:web
ServerHandler是对程序运行环境进行抽象,如stdin, stdout, softversion, logging等,主要起辅助做用,其具体工做机制暂时不得知,其有一个重要的成员函数run(self, application),HTTPServer利用该成员函数调用不一样的Handler处理不一样的请求。django
Handler是对URL请求进行处理的一种抽象,重点偏向上层应用处理,不一样的URL请求可能须要不一样的处理机制,所以须要定制多种不一样的Handler,Handler实体对应Server的application成员,显然,虽然Server在初始化时赋值了该application成员(wsgi_handler),可是程序在运行过程当中,随时能够动态调整该成员值以达到调用不一样的Handler处理不一样Request的目的。Handler的典型应用有staticfileHandler, WSGIHandler。前者的类视图以下图:app
Handler实体中loadmiddleware(), get_response(), _get_response(), make_view_atomic()都是很是重要的成员函数,完成对http请求处理的绝大部分操做。框架
Django程序一般拥有一个HTTPServer实体,一个HTTPServer实体与一个RequestHandler关联,RequestHandler在handle请求时须要一个ServerHandler实体的支撑,一个ServerHandler实体调用HTTPServer实体对应的多个Handler中一个进行请求处理。函数
在Django框架中,WSGI协议是链接Django框架和外部web server的桥梁,起着很是核心的做用,所以在分析过程当中一般直接分析WSGISserver,WSGIHandler,WSGIRequestHandler,而再也不介绍更抽象的HTTPServer,Handler等,关于这些抽象类的更多应用能够在python目录的test文件夹找到。atom
WSGISserver,WSGIRequestHandler ,ServerHandler,WSGIHandler之间的关联关系以下图所示:3d
django.core.management.base.commands.runserver.pyserver
from django.core.servers.basehttp import get_internal_wsgi_application, run
handler = self.get_handler(*args, **options) /* WSGIHandler 或StaticFilesHandler */
run(self.addr, int(self.port), handler, ipv6=self.use_ipv6, threading=threading)
django.core.servers.basehttp.pyblog
def run(addr, port, wsgi_handler, ipv6=False, threading=False):
httpd = WSGIServer(server_address, WSGIRequestHandler, ipv6=ipv6) /*初始化WSGIServer实体,并指定RequestHandler为WSGIRequestHandler */
httpd.set_app(wsgi_handler) /*指定applicaton为wsgi_handler */
httpd.serve_forever() /*启动服务,接受到来的请求,并处理之*/
注意,在RunserverCommand:Commond:get_handler()获取Handler时,根据配置参数不一样,返回不一样的Handler,即WSGIHandler 或者StaticFilesHandler。
if use_static_handler and (settings.DEBUG or insecure_serving):
return StaticFilesHandler(handler)
return handler /* WSGIHandler*/