Python Django框架在幕后是如何工作的?

Python Django框架在幕后是如何工作的?,python,django,uwsgi,gunicorn,django-middleware,Python,Django,Uwsgi,Gunicorn,Django Middleware,这个问题听起来可能很愚蠢,所以请提前道歉 我试图理解Django框架在幕后是如何工作的。据我所知,Django并非一直运行,当请求传入并按如下方式处理时,uwsgi/gunicorn或其他任何程序会调用Django: WsgiHandler或ModPythonHandler 导入设置、自定义异常 负载中间件 中间件->URL解析器 中间件->视图->模板 中间件->HttpResponse 但我无法理解的是,Django的任何部分都一直在运行,比如缓存管理或其他一些函数或实例,而不是按照请求创建

这个问题听起来可能很愚蠢,所以请提前道歉

我试图理解Django框架在幕后是如何工作的。据我所知,Django并非一直运行,当请求传入并按如下方式处理时,uwsgi/gunicorn或其他任何程序会调用Django:

WsgiHandler或ModPythonHandler 导入设置、自定义异常 负载中间件 中间件->URL解析器 中间件->视图->模板 中间件->HttpResponse
但我无法理解的是,Django的任何部分都一直在运行,比如缓存管理或其他一些函数或实例,而不是按照请求创建。如果你能解释一下或给出一些建议,我将不胜感激。

你没有说你的理解是从哪里来的,但这并不准确。Django本身对它的运行方式是相当不可知的——它取决于服务器——但它在每次请求时都被从头调用是非常不寻常的。唯一的方法是CGI,它会像狗一样运行

一般来说,Django有两种运行方式。它要么在web服务器本身的进程中运行(如Apache上的mod_wsgi),要么在完全独立的进程中运行,并通过反向代理从服务器接收请求,如uwsgi/gunicorn。无论哪种方式,Django进程的生存期都不会直接与请求连接,而是跨多个请求持久化。例如,在mod_wsgi的情况下,服务器根据配置启动线程和/或进程,每个线程和/或进程在被终止和重新启动之前都会持续大量的连续请求


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

您没有说您的理解来自何处,但这并不准确。Django本身对它的运行方式是相当不可知的——它取决于服务器——但它在每次请求时都被从头调用是非常不寻常的。唯一的方法是CGI,它会像狗一样运行

一般来说,Django有两种运行方式。它要么在web服务器本身的进程中运行(如Apache上的mod_wsgi),要么在完全独立的进程中运行,并通过反向代理从服务器接收请求,如uwsgi/gunicorn。无论哪种方式,Django进程的生存期都不会直接与请求连接,而是跨多个请求持久化。例如,在mod_wsgi的情况下,服务器根据配置启动线程和/或进程,每个线程和/或进程在被终止和重新启动之前都会持续大量的连续请求


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

谢谢Daniel!我知道一个进程可以用于多个请求,但是如果没有更多的传入请求,Django不会一直运行。所以,这意味着,如果我们试图缓存一些数据,例如,在使用类属性的模型中,只要进程没有终止,它就会留在内存中。它将在下一个进程中再次获取。如果我错了,请纠正我。确实,只要进程在运行,数据就会留在内存中,但如果没有更多的请求,Django就不会继续运行。这只会发生在一些自动缩放技术上,比如谷歌应用程序引擎:几乎所有的环境都不是这样工作的。还要注意的是,正如您所描述的,缓存只是每个进程的本地缓存,而不是跨进程共享的缓存。谢谢Daniel!我知道一个进程可以用于多个请求,但是如果没有更多的传入请求,Django不会一直运行。所以,这意味着,如果我们试图缓存一些数据,例如,在使用类属性的模型中,只要进程没有终止,它就会留在内存中。它将在下一个进程中再次获取。如果我错了,请纠正我。确实,只要进程在运行,数据就会留在内存中,但如果没有更多的请求,Django就不会继续运行。这只会发生在一些自动缩放技术上,比如谷歌应用程序引擎:几乎所有的环境都不是这样工作的。还请注意,正如您所描述的,缓存仅对每个进程是本地的,而不是跨进程共享的。