gpt4 book ai didi

django - 将 http abort/close 从 nginx 传播到 uwsgi/Django

转载 作者:行者123 更新时间:2023-12-03 12:58:27 24 4
gpt4 key购买 nike

我有一个 Django 应用程序 Web 应用程序,我想知道是否可以让 nginx 将中止/关闭传播到 uwsgi/Django。

基本上我知道 nginx 知道过早中止/关闭,因为它默认为 uwsgi_ignore_client_abort到“关闭”,并且在发送响应之前中止/关闭请求时,您的 nginx 日志中会出现 nginx 499 错误。一旦 uwsgi 完成处理请求,它会在将响应返回给 nginx 时抛出“IO 错误”。

车削uwsgi_ignore_client_abort “on”只是让 nginx 不知道中止/关闭,并删除 uwsgi“IO 错误”,因为 uwsgi 仍然可以写回 nginx。

我的用例是我有一个应用程序,人们可以非常快速地翻阅一些 ajax 结果,因此如果快速翻阅我中止他们跳过的页面的挂起 ajax 请求,这将保持客户端干净和高效。但这对服务器端(uwsgi/Django)没有任何作用,因为即使没有任何东西等待响应,它们仍然必须处理每个请求。

现在显然可能有某些页面,我不希望请求因任何原因过早中止。但是我将 celery 用于可能属于该类别的长时间运行的请求。

那么这可能吗? uwsgi's hariakari 设置让我觉得它在某种程度上......只是无法弄清楚如何去做。

最佳答案

My use case is that I have an application where people page through some ajax results very quickly, and so if the quickly page through I abort the pending ajax request for the page that they skipped, this keeps the client clean and efficient.



在客户端中止 AJAX 请求是通过 XMLHttpRequest.abort() 完成的.如果在 abort() 时请求还没有发出被调用,那么请求不会出去。但是如果请求已经发送, 服务器不会知道请求已中止。 连接不会关闭,不会有任何消息发送到服务器,什么都没有。如果您希望服务器知道不再需要请求,您基本上需要想出一种方法来识别请求,以便在您发出初始请求时获得它的标识符。然后,通过另一个 AJAX 请求,您可以告诉服务器应该取消先前的请求。 (如果您搜索有关 abort() like this one 的问题并搜索“服务器”,您会发现相同的解释。)

请注意 uwsgi_ignore_client_abort是在 TCP 级别处理连接关闭的东西。这与中止 AJAX 请求不同。您通常无法在 JavaScript 中执行需要关闭 TCP 连接的操作。浏览器优化连接的创建和销毁以满足其需求。刚才,我是这样做的:
  • 我用过 lsof检查是否有任何进程连接到 example.com .没有。 ( lsof 是一个 *nix 实用程序,它允许列出打开的文件。网络连接是 *nix 中的"file"。)
  • 我在 Chrome 中打开了一个指向 example.com 的页面。 lsof显示了连接和打开它的过程。
  • 然后我关闭了页面。
  • 我用 lsof 投票看看我之前确定的连接是否仍然打开。 即使没有真正需要保持连接打开,它在我关闭页面后仍保持打开状态大约一分钟。

  • 并且没有多少对 uswgi 设置的摆弄使其意识到通过 XMLHttpRequest.abort() 执行的中止。

    您提供的用例场景是用户快速浏览某些结果的场景。我可以看到问题中给出的描述的两种可能性:
  • 用户在进一步分页之前等待刷新。例如,Alice 正在查看按字母顺序为用户“Zeno”排序的用户名列表,每次显示新页面时,她都会看到名称不存在并向下翻页。在这种情况下,没有什么可以中止的,因为用户的操作取决于首先处理的请求。 (用户必须先查看新页面才能做出决定。)
  • 用户只需向下翻页,无需等待刷新。爱丽丝再次寻找“芝诺”,但她认为它会出现在最后一页,所以点击,点击,点击她去了。在这种情况下,您可以消除对服务器发出的请求。 然后按下下一页按钮,增加应显示给用户但不立即发送请求的页面编号。相反,您在用户停止单击按钮后等待一小段延迟,然后发送带有最终页码的请求,因此您发出一个请求而不是一打请求。 Here是为 DataTables 搜索执行的去抖动示例。
  • 关于django - 将 http abort/close 从 nginx 传播到 uwsgi/Django,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39780755/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com