【问题标题】:Failed to load resource: the server responded with a status of 504 (Gateway Timeout)加载资源失败:服务器响应状态为 504(网关超时)
【发布时间】:2017-08-21 14:42:54
【问题描述】:

我正在使用 django - python、javascript 开发一个项目。当我从视图中调用一个长时间运行的进程(耗时)大约 20 多分钟时,该进程成功启动。我在 ajax 中使用 loader 来通知用户进程正在运行。该过程完成后,加载程序将停止并更改为已完成状态。

但问题是每次在进程启动 14.59 分钟后,加载程序都会停止并且状态更改为已完成。但是在后台运行的进程还没有完成。在那之后页面崩溃。该过程完成后,我将结果绑定在网页中的标签下。在该标签中出现错误 504 (Gateway Timeout)。在 web 控制台日志 Failed to load resource: server 响应状态为 504 (Gateway Timeout),打印出上述错误。如果有人知道,请帮我解决这个问题。

django 在那之后是否关闭了连接?如果是这样,是否可以在 django 设置(settings.py)中提及 timeout。我尝试在 ajax 调用中给出超时但同样的问题返回。我的疑问是在 django 开发服务器上。 django开发服务器是否有超时。但是当我搜索这个问题时,我发现在 nginx 服务器中出现了相同类型的问题。 django 是依赖 nginx 还是使用它?

我试图提供有关我的问题的所有信息,如果有任何进一步的说明,请告诉我。

【问题讨论】:

  • 您使用的是什么网络服务器? nginx ?可以在您的服务器配置中配置超时。
  • 我建议使用这里提到的替代技术。 What are Long-Polling, Websockets, Server-Sent Events (SSE) and Comet?
  • 我没有使用任何网络服务器,我使用默认的 django 服务器,即 django 开发服务器。我还没有部署。
  • 如果你有长时间运行的后台任务,你应该使用一些异步任务队列在带外运行它们 - 芹菜浮现在脑海中。它不仅可以解决此类问题,而且还可以避免您的 Web 服务器超载,并且在需要时通过在有许多不同的服务器上运行 celery 工作者来更轻松地扩展。
  • 我不想将进程作为后台任务运行,用户必须等到长时间运行的进程完成

标签: javascript ajax django http-status-code-504


【解决方案1】:

服务器总是在特定时间后关闭其连接,可以通过更改其配置来修改,但这不是一个好方法。 我建议您尝试通过以下方式减少脚本花费的时间:

  • 优化您的代码。
  • 通过缓存经常使用的数据
  • 使用后端服务来处理您的数据并将它们存储在可以快速访问的临时存储设备中,例如 memcache 或 redis。

您还应该处理 ajax 调用的超时:

$.ajax({
    ...
    timeout: 1000,
    error: function(jqXHR, textStatus, errorThrown) {
        if(textStatus==="timeout") {
           //do something on timeout / show appropriate message.
        } 
    }
});​

调整性能和优化编码技术从而缩短时间的参考: https://docs.djangoproject.com/en/1.10/topics/db/optimization/ https://docs.djangoproject.com/en/1.10/topics/performance/ https://realpython.com/blog/python/caching-in-django-with-redis/

【讨论】:

  • 我已经用error函数处理了,但是没有进入error函数。
猜你喜欢
  • 2018-07-27
  • 1970-01-01
  • 2021-08-26
  • 2020-02-14
  • 2016-11-01
  • 2018-01-29
  • 2018-12-16
  • 2020-07-04
相关资源
最近更新 更多