2009-08-17 22 views
7

我在哪裏可以得到的技術手冊/內部如何Django的工作細節,即我想知道當一個請求從客戶端進來;我在哪裏可以獲得有關Django內部工作原理的技術信息?

  • 着Django函數接收呢?
  • 什麼中間件被調用?
  • 請求對象是如何創建的?以及什麼類/函數創建它?
  • 什麼函數將請求映射到必要視圖?
  • 請問你的代碼/視圖被調用

? 等等

Paul.G

+3

當你看到源代碼時,你看到了什麼? – 2009-08-17 09:49:59

回答

9

理解django內部最簡單的方法是通過閱讀專門爲此編寫的書。

閱讀Pro Django。它首先爲您提供深入的元編程理解,並演示如何在django模型中使用它,以動態創建它們。

它與其他許多python概念以及django如何使用它相似。

+2

是的,這是一個必讀! – 2009-08-17 10:22:15

+1

我同意。本書向您展示了Django使用的一些高級Python技術來提供它的實用框架。 – 2009-08-17 18:41:47

10

「使用源,盧克。」開源軟件的美妙之處在於您可以自己查看(修改)代碼。

+1

+1。通常這是一個無用的答案;但是Django源代碼是__very__可讀的。 – Javier 2009-08-17 04:44:52

+1

同意。大型項目的源代碼通常難以理解,除非您經常對其做出貢獻。但是Django高度模塊化,易於集中精力研究某個特定元素。 – Soviut 2009-08-17 04:51:30

+0

是的。當然,人們應該從Soviut指出的優秀的在線文檔開始。但是,對於這個問題所暗示的細節層面來說,看代碼是無可替代的。 – 2009-08-17 04:53:40

1

我懷疑有關於這個問題的技術手冊。這可能需要一點挖掘,但API文檔和源代碼是您獲得可靠的最新信息的最佳選擇。

0

文檔經常深入細節時,它必須以解釋爲什麼事情的工作他們的方式。 Django的設計目標之一是不要儘可能地依賴「魔術」。然而,無論何時Django 確實都假設了某些內容(例如,應用內的模板位置),它清楚地解釋了文檔中的原因,並且它總是以可預測的方式發生。

你的大多數問題將通過實施單頁來回答。

  1. 從客戶端請求一個特定的URL。
  2. 該url根據url模式匹配來解析調用哪個視圖。
  3. 請求通過中間件傳遞。
  4. 該視圖被調用並顯式傳遞了請求對象。
  5. 的觀點明確要求您指定的模板,並通過它您指定的上下文(變量)。
  6. 模板上下文處理器,如果有的話,然後將自己的變量添加到上下文中。
  7. 將上下文傳遞給模板並進行渲染。
  8. 呈現的模板返回給客戶端。

Django Documentation

Django Book

12

除了閱讀源,這裏是我的標籤,並在不久前從一個小書籤的幾篇文章:

我發現詹姆斯·班納特的blog是關於Django的運作信息的一個重要來源。他的書「Practical Django Projects」也是必讀文章,儘管它並不專注於內部,但你仍然可以瞭解django是如何工作的。

+0

噢,James Bennet的博客很棒。我從那裏爲很多網頁添加了書籤。他是一位非常優秀的作家,非常清楚。 – hughdbrown 2009-08-17 13:28:07

6

簡單地閱讀源代碼可能有些壓倒,尤其是因爲最上面的部分有點混亂(web服務器如何將請求轉交給Django代碼)。我找到一個好辦法,開始閱讀代碼是設置一個斷點調試器在您的視圖功能:

​​

然後點擊您的網址。當您的斷點中斷調試,檢查堆棧:

(Pdb) where 
    c:\abcxyzproject\django\core\management\commands\runserver.py(60)inner_run() 
-> run(addr, int(port), handler) 
    c:\abcxyzproject\django\core\servers\basehttp.py(698)run() 
-> httpd.serve_forever() 
    c:\python25\lib\socketserver.py(201)serve_forever() 
-> self.handle_request() 
    c:\python25\lib\socketserver.py(222)handle_request() 
-> self.process_request(request, client_address) 
    c:\python25\lib\socketserver.py(241)process_request() 
-> self.finish_request(request, client_address) 
    c:\python25\lib\socketserver.py(254)finish_request() 
-> self.RequestHandlerClass(request, client_address, self) 
    c:\abcxyzproject\django\core\servers\basehttp.py(560)__init__() 
-> BaseHTTPRequestHandler.__init__(self, *args, **kwargs) 
    c:\python25\lib\socketserver.py(522)__init__() 
-> self.handle() 
    c:\abcxyzproject\django\core\servers\basehttp.py(605)handle() 
-> handler.run(self.server.get_app()) 
    c:\abcxyzproject\django\core\servers\basehttp.py(279)run() 
-> self.result = application(self.environ, self.start_response) 
    c:\abcxyzproject\django\core\servers\basehttp.py(651)__call__() 
-> return self.application(environ, start_response) 
    c:\abcxyzproject\django\core\handlers\wsgi.py(241)__call__() 
-> response = self.get_response(request) 
    c:\abcxyzproject\django\core\handlers\base.py(92)get_response() 
-> response = callback(request, *callback_args, **callback_kwargs) 
> c:\abcxyzproject\abcxyz\helpers\views.py(118)time() 
-> return HttpResponse(
(Pdb) 

現在你可以看到的路徑從Web服務器到您的視圖功能最深的部分摘要。使用「up」命令向上移動堆棧,使用「list」和「print」命令檢查這些堆棧幀中的代碼和變量。

相關問題