1、HTTPServer,RequestHandler,ServerHandler,Handler

1.      HTTPServer,RequestHandler,ServerHandler,Handler

1.1       基本概念

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

1.2       類視圖關係

WSGISserver,WSGIRequestHandler ,ServerHandler,WSGIHandler之間的關聯關係以下圖所示:3d

 

1.3       初始化及其調用關係

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*/
相關文章
相關標籤/搜索