资源加载失败:服务器响应状态为504(网关超时)

5
我正在使用 Django - Python 和 JavaScript 开发一个项目。当我从视图中调用一个耗时大约超过20分钟的长时间运行的进程时,进程会成功启动。我在 Ajax 中使用 loader 来通知用户进程正在运行。进程完成后,loader 将停止并更改为已完成状态。

但问题是每次从进程开始后的14.59分钟后,loader 就停止工作并且状态更改为已完成。但是后台运行的进程尚未完成。此后页面会崩溃。当进程完成后,我将结果绑定在网页上的标签下。在该标签中出现错误504 (网关超时)。网页控制台日志中打印了未能加载资源:服务器以 504 网关超时的状态响应,上述错误。如果有人知道,请帮我解决这个问题。

Django 是否会在那段时间后关闭连接?如果是,是否可以在 Django 设置(settings.py)中指定超时时间?我尝试在 Ajax 调用中设置超时,但仍然出现相同的问题。我的疑问在于 Django 开发服务器。Django 开发服务器是否存在超时?但是当我搜索此问题时,我发现在nginx服务器上也会出现同样类型的问题。Django 是否依赖于 nginx 或者使用它?

我尝试提供有关我的问题的所有信息,如果需要进一步澄清,请告诉我。


您正在使用哪个Web服务器?nginx?超时时间可以在服务器配置中进行配置。 - abhishekkannojia
我建议使用像这里提到的替代技术。什么是长轮询、Websockets、服务器发送事件(SSE)和Comet? - abhishekkannojia
我没有使用任何Web服务器,而是使用默认的Django服务器,即Django开发服务器。我还没有部署。 - Antony
如果您有长时间运行的后台任务,应该使用一些异步任务队列来在外部运行它们 - celery 是一个不错的选择。这不仅可以解决此类问题,还可以避免过载 Web 服务器,并且通过在尽可能多的不同服务器上运行 celery 工作程序,在需要时更容易扩展。 - bruno desthuilliers
我不想将该进程作为后台任务运行,用户必须等待长时间运行的进程完成。 - Antony
1个回答

5
服务器总是在一定时间后关闭它的连接,该时间可以通过更改其配置进行修改,但这不是一个好方法。 我建议您尝试通过以下方式缩短脚本运行时间:
  • 优化您的代码。
  • 缓存常用数据。
  • 使用后端服务处理和存储数据到临时存储器中,例如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/

1
我已经使用了错误函数来处理它,但它并没有进入错误函数。 - Antony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接