0

我在 apache2.2 的守护进程模式下使用 mod_wsgi 部署了 Django。因此,在 Django 生成内容之后,它是否将所有内容都从那里移交给 apache 以使其以其优化的荣耀提供服务,或者 Django 在此服务步骤中是否仍以某种方式征税?

4

2 回答 2

3

FWIW,在 mod_wsgi 1.X 中,允许 Apache 执行输出缓冲默认是关闭的。这是因为 WSGI 规范有效地禁止了底层 Web 服务器的输出缓冲。这是因为 WSGI 规范要求在从可迭代/生成器返回的每个字符串之后将数据刷新回浏览器。

换句话说,启用输出缓冲是可选的,并且比其他任何事情都更像是一个实验。它被删除是因为 WSGI 禁止它,并且因为它实际上使 mod_wsgi 代码复杂化,因为当需要为某些 Apache 版本中的不正确行为实施一些变通方法时。

于 2009-06-24T12:19:36.750 回答
3

WSGI 接口表明(http://www.python.org/dev/peps/pep-0333/)调用了您的 WSGI 应用程序(在本例中为 Django),并且必须返回内容。

Django 调用了你的视图函数。您的视图函数返回了一个渲染的模板。Django 返回渲染模板的结果。并且,它代表您调用了start_response可调用对象。

向后工作另一个步骤,Apache 调用了 mod_wsgi。start_responsemod_wsgi(遵循 WSGI 规则)创建环境并将其与Django 可以使用的可调用对象一起交给 Django 。

当 Django 调用start_response时,mod_wsgi 有义务收集该响应并对其进行处理。它把它交给 Apache 来反馈给浏览器。

请注意,Django 可能会非常匆忙地完成。然而,Apache 却卡住了将初始页面向下传递到浏览器。然后,浏览器开始请求 .JS 库、.CSS 文件和所有这些图像。理想情况下,Apache 会处理所有其余的后续请求。


您可能会问“mod_wsgi 是否为我缓冲?” 答案因版本而异。Pre 2.0 mod_wsgi 可以为你积累一个缓冲区。mod_wsgi 2.0 及更高版本不缓冲,它假定应用程序能够缓冲,或者包含用于缓冲的中间件。

http://code.google.com/p/modwsgi/wiki/ChangesInVersion0200

通常,您的 Django 模板在一个缓冲区中呈现,并被一次性交给 mod_wsgi,供 Apache 应用输出过滤器并将其滴入浏览器。

于 2009-04-02T16:44:41.620 回答