【问题标题】:How Django framework works behind the scenes?Django 框架如何在幕后工作?
【发布时间】:2014-04-17 20:24:20
【问题描述】:

这听起来可能很愚蠢,所以提前道歉。

我试图了解 Django 框架在幕后的实际工作方式。据我了解,Django 并非一直运行,而是在请求进入时被 uwsgi/gunicorn 或其他任何东西调用并按如下方式处理:

  1. WsgiHandler 或 ModPythonHandler
  2. 导入设置、自定义例外
  3. 加载中间件
  4. 中间件 -> URLResolver
  5. 中间件 -> 视图 -> 模板
  6. 中间件 -> HttpResponse

但我无法理解的是,Django 的任何部分一直在运行,例如缓存管理或其他一些功能或实例,而不是根据请求创建。如果您能解释一下或提供指点,我将不胜感激。

【问题讨论】:

    标签: python django uwsgi gunicorn django-middleware


    【解决方案1】:

    你没有说你的“理解”来自哪里,但这并不准确。 Django 本身对于它的运行方式是非常不可知的——它取决于服务器——但是在每个请求上从头开始调用它是非常不寻常的。关于这种情况的唯一方法是 CGI,它会像狗一样奔跑。

    非常一般的术语来说,Django 有两种运行方式。它要么在 Web 服务器本身的进程中运行 - 就像 Apache 上的 mod_wsgi 一样 - 或者它在完全独立的进程中运行并通过反向代理从服务器接收请求,就像 uwsgi/gunicorn 一样。无论哪种方式,Django 进程的生命周期都不会直接与请求相关联,而是在许多请求中持续存在。以 mod_wsgi 为例,服务器启动线程和/或进程(取决于配置),每个进程持续大量连续请求,然后被杀死并重新启动。

    对于每个进程,这意味着任何已加载的模块都会在进程的生命周期内保留在内存中。从中间件开始的所有内容都执行一次,但通常不需要每次都重新导入和运行。

    【讨论】:

    • 谢谢丹尼尔!我知道一个进程可以存在多个请求,但如果没有更多传入请求,Django 不会一直运行。因此,这意味着如果我们尝试缓存一些数据,例如,在使用类属性的模型中,只要进程没有终止,它就会保留在内存中。它将在下一个过程中再次获取。请纠正我,如果我错了。
    • 确实,只要进程在运行,数据就只保留在内存中,但并不是说“如果没有更多请求,Django 就不会继续运行”。这只会发生在某种自动缩放技术(例如 Google App Engine)上:几乎所有环境不会像那样工作。另请注意,您所描述的缓存仅对每个进程都是本地的,而不是跨进程共享的。
    猜你喜欢
    • 1970-01-01
    • 2017-01-17
    • 2018-04-02
    • 2015-08-27
    • 1970-01-01
    • 2014-11-18
    • 2011-02-17
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多