我在哪里可以获得有关Django内部工作原理的技术信息?

时间:2009-08-17 04:38:12

标签: python django

我在哪里可以获得django内部工作方式的技术手册/详细信息,即我想知道客户请求何时进入;

  • 哪个django函数收到它?
  • 什么中间件被称为?
  • 请求对象是如何创建的?什么类/功能创建它?
  • 什么功能将请求映射到必要的视图?
  • 您的代码/视图如何被调用

? 等...

Paul.G

6 个答案:

答案 0 :(得分:12)

除了阅读消息来源之外,这里有一些我刚刚标记过的文章和书签:

我发现James Bennet的blog是关于django工作的信息的重要来源。他的书Practical Django Projects也是必读的 - 虽然它并不专注于内部,但你仍然可以了解django是如何工作的。

答案 1 :(得分:11)

“使用来源,卢克。”开源软件的优点在于您可以自己查看(和修改)代码。

答案 2 :(得分:9)

了解django内部的最简单方法是阅读一本专门为此而写的书。

阅读Pro Django。它首先为您提供了对元编程的深入理解,并演示了如何在django模型中使用它来动态创建它们。

它与许多其他python概念类似,以及django如何使用它。

答案 3 :(得分:6)

简单地阅读源可能有点压倒性,特别是因为最上面的部分有点令人困惑(web服务器如何将请求移交给Django代码)。我发现开始阅读代码的一个好方法是在视图函数中设置调试器断点:

def time(request):
    import pdb; pdb.set_trace() 
    return HttpResponse(blah blah)

然后点击你的网址。当调试器在断点处中断时,检查堆栈:

(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”命令检查这些堆栈帧的代码和变量。

答案 4 :(得分:1)

我怀疑有关于这个主题的技术手册。它可能需要一些挖掘,但API文档和源代码是您获得可靠,最新信息的最佳选择。

答案 5 :(得分:0)

为了解释为什么事情按照他们的方式运作,文档通常会详细说明。 Django的设计目标之一是尽可能不依赖“魔法”。但是,每当Django 假设某些东西(例如,应用程序中的模板位置)时,它就会清楚地解释为什么在文档中并且它总是以可预测的方式发生。

您的大多数问题都可以通过实施单页来解答。

  1. 客户向特定网址发出请求。
  2. 该网址根据网址格式匹配解析要调用的视图。
  3. 请求通过中间件传递。
  4. 调用视图并显式传递请求对象。
  5. 视图显式调用您指定的模板,并将其指定的上下文(变量)传递给它。
  6. 模板上下文处理器(如果有),然后将自己的变量添加到上下文中。
  7. 将上下文传递给模板并进行渲染。
  8. 渲染的模板将返回给客户端。
  9. Django Documentation

    Django Book