2014-04-17 59 views
1

這可能聽起來很愚蠢,所以提前道歉。Django框架如何在幕後工作?

我想了解Django框架是如何在幕後實際工作的。這是我的理解是Django不運行所有的時間和得到由uwsgi/gunicorn或任何東西,當請求中的其他調用和處理如下:

  1. WsgiHandler或ModPythonHandler
  2. 導入設置,自定義異常
  3. 負載中間件
  4. 中間件 - > URLResolver
  5. 中間件 - >查看 - >模板
  6. 中間件 - >的HttpResponse

但我無法理解的是,有沒有Django的任何部分,像緩存管理或一些其他功能或實例一直運行,而不是每個請求創建。如果你能解釋一下或者給點建議,我會很感激。

回答

4

你不說你的「理解」來自哪裏,但它並不真實。 Django本身對它的運行方式很不確定 - 它依賴於服務器 - 但它在每個請求中從頭開始調用是非常不尋常的。關於這種情況的唯一方法是CGI,它會像狗一樣運行。

說起非常一般來說,Django有兩種運行方式可以運行。要麼它運行在Web服務器本身的進程內 - 就像Apache上的mod_wsgi一樣 - 或者它運行在一個完全獨立的進程中,並通過服務器的反向代理接收請求,就像uwsgi/gunicorn一樣。無論哪種方式,Django進程的生命週期都不與請求直接相關,而是跨越許多請求持續存在。例如,在mod_wsgi的情況下,服務器啓動線程和/或進程(取決於配置),並且每個請求在被終止並重新啓動之前持續大量的連續請求。

對於每個進程,這意味着任何已加載的模塊都會在進程的整個生命週期內保留在內存中。從中間件開始的所有內容都是,每個請求執行一次,但通常不需要每次都重新導入並運行它們。

+0

謝謝丹尼爾!我知道一個進程可以存在多個請求,但是如果沒有更多的請求,Django不會一直運行。所以,這意味着如果我們嘗試緩存一些數據,例如,在使用類屬性的模型中,只要進程沒有終止,它就會保留在內存中。它會在下一個過程中再次提取。請糾正我,如果我錯了。 –

+1

只要進程正在運行,數據只保留在內存中,但不是「如果沒有更多請求,Django不會繼續運行」。這隻會發生在某種自動縮放技術上,例如Google App Engine:幾乎所有的環境都不會像那樣工作。還要注意,如您所描述的緩存僅限於每個進程本地,並且不會跨進程共享。 –

+0

謝謝!我必須upvote您的評論。 :-) –