天天看點

Django源碼分析之server

django内置的server基本包括兩部分:django.core.servers和django.core.handlers

Django源碼分析之server

servers.basehttp是django自身提供的一個用于開發測試的server子產品,其中提供的wsgiserver、serverhandler、wsgirequesthandler其實都是屬于wsgi server,django隻不過是對python内置的wsgi子產品simple_server做的一層包裝。

handlers package包括base.py和wsgi.py兩個子產品。

base.py中隻定義了一個basehandler類,它複雜一些基礎的功能,比如加載中間件,處理異常,擷取響應資料等

wsgi.py才是主角,其中最重要的就是wsgihandler類,它繼承了base.py中的basehandler,隻添加了一個__call__方法,那為什麼添加這個方法呢?

django.core.wsgi

可見我們啟動server時傳入的application其實是wsgihandler的一個執行個體,而根據wsgi規範,這個application必須要是callable,python中的callable包括函數、方法以及任何定義了__call__方法的對象

回到handlers.wsgi

由于__call__是一個請求的入口,它需要調用basehandler中定義的方法去執行加載中間件等一系列操作和異常處理,除此之外,wsgihandler還會處理cookie、觸發signal等。

至于如何傳回響應,具體可看handlers.base子產品,大概就是找出請求的path,通過比對路由,找到并執行使用者定義的view方法,執行中間件處理方法,最後傳回響應。當然,還有一系列的異常處理。