Django 和其他 Web 框架的 HTTP 處理的流程大致相同,Django 處理一個(gè) Request 的過(guò)程是首先通過(guò)中間件,然后再通過(guò)默認(rèn)的 URL 方式進(jìn)行的。我們可以在 Middleware 這個(gè)地方把所有 Request 攔截住,用我們自己的方式完成處理以后直接返回 Response。
(1) 加載配置
Django 的配置都在 “Project/settings.py” 中定義,可以是 Django 的配置,也可以是自定義的配置,并且都通過(guò) django.conf.settings 訪問(wèn),非常方便。
(2) 啟動(dòng)
最核心動(dòng)作的是通過(guò) django.core.management.commands.runfcgi 的 Command 來(lái)啟動(dòng),它運(yùn)行 django.core.servers.fastcgi 中的 runfastcgi,runfastcgi 使用了 flup 的 WSGIServer 來(lái)啟動(dòng) fastcgi 。而 WSGIServer 中攜帶了 django.core.handlers.wsgi 的 WSGIHandler 類的一個(gè)實(shí)例,通過(guò) WSGIHandler 來(lái)處理由 Web 服務(wù)器(比如 Apache,Lighttpd 等)傳過(guò)來(lái)的請(qǐng)求,此時(shí)才是真正進(jìn)入 Django 的世界。
(3) 處理 Request
當(dāng)有 HTTP 請(qǐng)求來(lái)時(shí),WSGIHandler 就開(kāi)始工作了,它從 BaseHandler 繼承而來(lái)。WSGIHandler 為每個(gè)請(qǐng)求創(chuàng)建一個(gè) WSGIRequest 實(shí)例,而 WSGIRequest 是從 http.HttpRequest 繼承而來(lái)。接下來(lái)就開(kāi)始創(chuàng)建 Response 了。
(4) 創(chuàng)建 Response
BaseHandler 的 get_response 方法就是根據(jù) request 創(chuàng)建 response,而具體生成 response 的動(dòng)作就是執(zhí)行 urls.py 中對(duì)應(yīng)的 view 函數(shù)了,這也是 Django 可以處理“友好 URL ”的關(guān)鍵步驟,每個(gè)這樣的函數(shù)都要返回一個(gè) Response 實(shí)例。此時(shí)一般的做法是通過(guò) loader 加載 template 并生成頁(yè)面內(nèi)容,其中重要的就是通過(guò) ORM 技術(shù)從數(shù)據(jù)庫(kù)中取出數(shù)據(jù),并渲染到 Template 中,從而生成具體的頁(yè)面了。
(5) 處理 Response
Django 返回 Response 給 flup,flup 就取出 Response 的內(nèi)容返回給 Web 服務(wù)器,由后者返回給瀏覽器。
總之,Django 在 fastcgi 中主要做了兩件事:處理 Request 和創(chuàng)建 Response,而它們對(duì)應(yīng)的核心就是“ urls 分析”、“模板技術(shù)”和“ ORM 技術(shù)”。