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*/