2014-04-17 34 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您的评论。 :-) –